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.
¿Que clase de mensajito es? Prueba a ver si con malloc te da ese problema.
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.
Ya esta solo tienes que añadir esto al destructor:
CPalabra::~CPalabra(){
cPalabra=0;
delete cPalabra;
}
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.
Pruebalo, a mi me funciona :) .
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.
Cita de: "Douch"En teoría solo con delete debería bastar.
Pero recuerda que debería ser un
delete[], no un
delete.
ER
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[].
CitarPero recuerda que debería ser un delete[], no un delete.
Oido cocina!! :D
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
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!!
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
Efectivamente, esto tendria que ser así:
CPalabra::CPalabra(char *cPal)
{
cPalabra = new char[strlen(cPal)];
strcpy(cPalabra , cPal);
}
VinCenT
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);
}
:)
uops! Toda la razón del mundo! :rolleyes:
A que tanto lio
std::string palabra("pepeluis");
cout << palabra;
Ni un solo delete
cout << "pepeluis";
También sin deletes. :P
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
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.
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.
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;
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