Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Delete

Iniciado por Douch, 10 de Mayo de 2005, 11:26:12 PM

« anterior - próximo »

Douch

 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.

Sacrifai

 ¿Que clase de mensajito es? Prueba a ver si con malloc te da ese problema.

Warchief

 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.

Sacrifai

 Ya esta solo tienes que añadir esto al destructor:


CPalabra::~CPalabra(){
 cPalabra=0;
 delete cPalabra;
}

Warchief

 
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.

Sacrifai

 Pruebalo, a mi me funciona :) .

Douch

 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.

Warchief

 
Cita de: "Douch"En teoría solo con delete debería bastar.
Pero recuerda que debería ser un delete[], no un delete.

ZeruGiran


ZeruGiran

 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[].


Douch

 
CitarPero recuerda que debería ser un delete[], no un delete.
Oido cocina!!  :D  

fiero

 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
www.videopanoramas.com Videopanoramas 3D player

MChiz

 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!!

zupervaca

 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

vincent

 Efectivamente, esto tendria que ser así:

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

VinCenT
Desarrollo en .Net y metodologías http://devnettips.blogspot.com






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.