Programación General > C/C++

 No estoy eliminando bien la memoria dinamica

(1/2) > >>

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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa