Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Douch en 10 de Mayo de 2005, 11:26:12 PM

Título: Problema Con Delete
Publicado por: Douch en 10 de Mayo de 2005, 11:26:12 PM
 Weno, ya estoy harto de C puro y duro así que he decidido a dar el siguiente paso y comenzar con C++ y sus amigos las Clases.

Todo iba magnífico hasta que comencé a probar cosas raras y me ha surgido un error en tiempo de ejecución. Como no, con punteros.

Citar
#include
#include
using namespace std;

class CPalabra{
   private:
      char *cPalabra;

   public:
      CPalabra();
      CPalabra(char*);
      ~CPalabra();
      void ImprimirPalabra(void) {cout << cPalabra;};
};

CPalabra::CPalabra(char *cPal){

   cPalabra = new char;
   strcpy(cPalabra , cPal);
}

CPalabra::~CPalabra(){
//Lo chungo viene aquí. En tiempo de ejecución salta un mensajito
   delete cPalabra;
}

int main(){

   CPalabra palabra("hola");

   palabra.ImprimirPalabra();

   return 0;
}

Como veis, algo sencillito. Pruebo a cargar una cadena de texto dentro de una variable privada de la clase y luego imprimo dicha palabra. El problema viene con el delete. Si compilo en Debug, salta un error cuando llega al delete. Si compilo en Release, no. ¿Qué es lo que hago mal?. Uso Visual C++ (Visual Studio 6).

Saludos.
Título: Problema Con Delete
Publicado por: Sacrifai en 10 de Mayo de 2005, 11:48:04 PM
 ¿Que clase de mensajito es? Prueba a ver si con malloc te da ese problema.
Título: Problema Con Delete
Publicado por: Warchief en 10 de Mayo de 2005, 11:52:09 PM
 Uhm, no debería ser un array?


char* cPalabra = new char[max];
strcpy(cPalabra, "Hola");
delete [] cPalabra;


Si te hace falta algún código sobre el tema:
http://c.conclase.net/curso/index.php?cap=030 (si prefieres trabajarlo tú no mires!! XD)


El problema es que strcpy se carga una zona de memoria que no es suya, ya que el puntero sólo tiene espacio para 1 char, no para 4+1.
Título: Problema Con Delete
Publicado por: Sacrifai en 10 de Mayo de 2005, 11:56:59 PM
 Ya esta solo tienes que añadir esto al destructor:


CPalabra::~CPalabra(){
 cPalabra=0;
 delete cPalabra;
}
Título: Problema Con Delete
Publicado por: Warchief en 10 de Mayo de 2005, 11:59:20 PM
 
Cita de: "Sacrifai"Ya esta solo tienes que añadir esto al destructor:


CPalabra::~CPalabra(){
 cPalabra=0;
 delete cPalabra;
}
:blink:  Comorl? Eso se carga el puntero.
Título: Problema Con Delete
Publicado por: Sacrifai en 10 de Mayo de 2005, 11:59:38 PM
 Pruebalo, a mi me funciona :) .
Título: Problema Con Delete
Publicado por: Douch en 11 de Mayo de 2005, 12:29:18 AM
 Ehhh, hummm... vale, Warchief gana. "Me se ha olvidao" ponerle el tamaño en el new.
cPalabra = new char[strlen(cPal)+1];
CitarPruebalo, a mi me funciona
Sep, funciona pero eso no me convence nada. En teoría solo con delete debería bastar.

Gracias muxaxos.
Título: Problema Con Delete
Publicado por: Warchief en 11 de Mayo de 2005, 12:32:45 AM
 
Cita de: "Douch"En teoría solo con delete debería bastar.
Pero recuerda que debería ser un delete[], no un delete.
Título: Problema Con Delete
Publicado por: ZeruGiran en 11 de Mayo de 2005, 01:06:58 AM
 ER
Título: Problema Con Delete
Publicado por: ZeruGiran en 11 de Mayo de 2005, 01:15:46 AM
 Esas lineas esta mal.


cPalabra=0;
delete cPalabra;


Hace un delete a la localidad 0 de la memoria. Y la memoria que fue asignada con new sigue estando reservada.

Prueba con delete[].

Título: Problema Con Delete
Publicado por: Douch en 11 de Mayo de 2005, 01:25:56 AM
 
CitarPero recuerda que debería ser un delete[], no un delete.
Oido cocina!!  :D  
Título: Problema Con Delete
Publicado por: fiero en 11 de Mayo de 2005, 02:43:32 AM
 un var=new char[100]; se libera con delete var;  lo de los [] es para liberar un array de otra cosa, no simplemente para una cadena de caracteres.

un saludo

PD: y esto es de 1º de carrera, seguramente usted no lo sabe porque ese dia estaria pirateando... XD
Título: Problema Con Delete
Publicado por: MChiz en 11 de Mayo de 2005, 07:33:41 AM
 Hola!

No estoy de acuerdo. Siempre que se hace un new[] hay que hacer un delete[]. Aunque para este caso recomendaría utilizar std::string =)

talueKs!!
Título: Problema Con Delete
Publicado por: zupervaca en 11 de Mayo de 2005, 10:47:43 AM
 el delete [] llama a los destructures de las clases, en este caso no importa ponerlo o no ya que char es un tipo de dato, referente al hilo como veo que cPal es una cadena de texto terminada en cero puedes usar la funcion strlen dentro del constructor para el new y el memcpy

saludos
Título: Problema Con Delete
Publicado por: vincent en 11 de Mayo de 2005, 11:42:00 AM
 Efectivamente, esto tendria que ser así:

CPalabra::CPalabra(char *cPal)
{
 cPalabra = new char[strlen(cPal)];
 strcpy(cPalabra , cPal);
}

VinCenT
Título: Problema Con Delete
Publicado por: Warchief en 11 de Mayo de 2005, 12:16:32 PM
Cita de: "vincent"Efectivamente, esto tendria que ser así:

CPalabra::CPalabra(char *cPal)
{
 cPalabra = new char[strlen(cPal)];
 strcpy(cPalabra , cPal);
}

VinCenT

CPalabra::CPalabra(char *cPal)
{
 cPalabra = new char[strlen(cPal)+1];
 strcpy(cPalabra , cPal);
}

:)  
Título: Problema Con Delete
Publicado por: vincent en 11 de Mayo de 2005, 12:58:00 PM
 uops! Toda la razón del mundo!  :rolleyes:  
Título: Problema Con Delete
Publicado por: samsaga2 en 11 de Mayo de 2005, 07:47:06 PM
 A que tanto lio


std::string palabra("pepeluis");
cout << palabra;


Ni un solo delete
Título: Problema Con Delete
Publicado por: Warchief en 11 de Mayo de 2005, 08:16:03 PM
 
cout << "pepeluis";


También sin deletes.  :P
Título: Problema Con Delete
Publicado por: zupervaca en 11 de Mayo de 2005, 10:47:51 PM
 le gustara tener el control maximo sobre sus string

saludos

pd: pasare de postear por este hilo si comienza una guerra de std y no std  :D  
Título: Problema Con Delete
Publicado por: Douch en 11 de Mayo de 2005, 10:54:51 PM
 
Cita de: "samsaga2"A que tanto lio


std::string palabra("pepeluis");
cout << palabra;


Ni un solo delete
Hombreeee, el objetivo es aprender "clases", no a manejar cadenas de texto :P.  
Título: Problema Con Delete
Publicado por: O2 en 12 de Mayo de 2005, 08:55:00 PM
 Yo tenía entendido que delete [] era para liberar arrays enteros de punteros con memoria reservada.

zupervaca : Dices que delete [] llama al destructor de la clase culla memoria se libera, Pero ¿acaso delete no lo hace?

Saludos.
Título: Problema Con Delete
Publicado por: Pogacha en 13 de Mayo de 2005, 01:29:05 AM
 ClaseA * a = new ClaseA [255];es lo mismo que:ClaseA  * a = malloc (sizeof (ClaseA ) *255 ):
for(int i =0; i<255; i++) a[i].ClaseA(); // constructor de cada una


delete []a;Es lo mismo que:for(int i =0; i<255; i++) a[i].~ClaseA(); // desconstructor de cada una
free(a);
// al 255 lo saca de la direccion de memoria (int*)a[-1] o de por ahí cerca nomas;

Título: Problema Con Delete
Publicado por: zupervaca en 13 de Mayo de 2005, 12:53:42 PM
 
Cita de: "O2"Yo tenía entendido que delete [] era para liberar arrays enteros de punteros con memoria reservada.

zupervaca : Dices que delete [] llama al destructor de la clase culla memoria se libera, Pero ¿acaso delete no lo hace?

Saludos.

pogacha lo ha indicado bien, yo no me hubiera expresado mejor