Programación General > C/C++
No estoy eliminando bien la memoria dinamica
pacorubio77:
Hola, la ejecucion de mi programa funciona bien, pero creo que no estoy haciendo bien algun delete.
Por ejemplo yo tengo mi main
int main(){
TPoro c4(4,5,20.35,"YElloW");
cout<<c4<<endl;
return 0;
}
el valgrind me dice lo siguiente:
==14577== Mismatched free() / delete / delete []
==14577== at 0x402599A: operator delete(void*) (vg_replace_malloc.c:342)
==14577== by 0x8049044: TPoro::~TPoro() (TPoro.cpp:151)
==14577== by 0x8048993: main (tad.cpp:107)
==14577== Address 0x42c4028 is 0 bytes inside a block of size 7 alloc'd
==14577== at 0x402630E: operator new[](unsigned int) (vg_replace_malloc.c:268)
==14577== by 0x8048CE1: TPoro::TPoro(int, int, double, char*) (TPoro.cpp:92)
==14577== by 0x8048960: main (tad.cpp:10)
==14577==
==14577== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 1)
==14577== malloc/free: in use at exit: 0 bytes in 0 blocks.
==14577== malloc/free: 1 allocs, 1 frees, 7 bytes allocated.
==14577== For counts of detected errors, rerun with: -v
==14577== All heap blocks were freed -- no leaks are possible.
yo creo que puede ser en uno de los siguiente metodos
--- Código: C++ --- TPoro::~TPoro(){ //cout<<"paso al destructor"<<endl; x=0; y=0; volumen=0.0; //comprobaré que color es distinto de NULL, para asegurarme y hacer delete if(color !=NULL){ delete color; color=NULL; } //color=NULL; //me curo en salud y me aseguro para ponerlo a NULL; //cout<<"salgo del destructor"<<endl; } TPoro::TPoro(int px,int py,double vol,char *col){ int tam; //cout<<"a la funcion"<<endl; x=px; y=py; volumen=vol; if(col!=NULL){ color=new char[strlen(col)+1]; //cout<<"COL "<<color<<endl; if(color==NULL){ return; } //if(color !=NULL){ //cout<<"llego aqui"<<endl; Convertir(col,color); //strcpy(color,col); //cout<<"salgo?"<<endl; //} } else{ color=NULL; return; } //cout<<"salgo de la funcion"<<endl; //cout<<"color "<<color<<endl; }
No libero bien la memoria?
me pueden ayudar?
Eternal Idol:
Lo dice ahi mismo:
Mismatched free() / delete / delete []
operator new[](unsigned int) (vg_replace_malloc.c:268)
Estas usando new[] y delete, cuando usas new[] tenes que usar delete[].
pacorubio77:
--- Cita de: "Eternal Idol" ---Lo dice ahi mismo:
Mismatched free() / delete / delete []
operator new[](unsigned int) (vg_replace_malloc.c:268)
Estas usando new[] y delete, cuando usas new[] tenes que usar delete[].
--- Fin de la cita ---
pero es que no lo entiendo, donde tengo que hacer delete,,..no lo veo...
Eternal Idol:
Ya lo estas haciendo, pero mal, tiene que coincidir el tipo de reserva y de liberacion de memoria. Ahora tenes esto:
color=new char[strlen(col)+1];
delete color;
Tenes que usar delete[] para la memoria reservada con new[] (asi se libera y se llama al constructor por cada uno de los objetos, en este caso no hay por ser un tipo primitivo, pero esa es la idea y por eso se queja).
pacorubio77:
--- Cita de: "Eternal Idol" ---Ya lo estas haciendo, pero mal, tiene que coincidir el tipo de reserva y de liberacion de memoria. Ahora tenes esto:
color=new char[strlen(col)+1];
delete color;
Tenes que usar delete[] para la memoria reservada con new[] (asi se libera y se llama al constructor por cada uno de los objetos, en este caso no hay por ser un tipo primitivo, pero esa es la idea y por eso se queja).
--- Fin de la cita ---
es decir tengo que hacer delete []color? o no es eso lo que me estais diciendo?
Pero de la forma que lo hago yo está mal?
como no se quejaria valgrind?
Navegación
[#] Página Siguiente
Ir a la versión completa