• Lunes 6 de Mayo de 2024, 14:35

Autor Tema:  No estoy eliminando bien la memoria dinamica  (Leído 1556 veces)

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
No estoy eliminando bien la memoria dinamica
« en: Miércoles 28 de Octubre de 2009, 20:09 »
0
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++
  1.  
  2. TPoro::~TPoro(){
  3.  
  4.     //cout<<"paso al destructor"<<endl;
  5.     x=0;
  6.     y=0;
  7.     volumen=0.0;
  8.     //comprobaré que color es distinto de NULL, para asegurarme y hacer delete
  9.  
  10.     if(color !=NULL){
  11.         delete color;
  12.         color=NULL;
  13.     }
  14.     //color=NULL; //me curo en salud y me aseguro para ponerlo a NULL;
  15.    
  16.     //cout<<"salgo del destructor"<<endl;
  17.  
  18. }
  19.  
  20. TPoro::TPoro(int px,int py,double vol,char *col){
  21.  
  22.     int tam;
  23.  
  24.  
  25.     //cout<<"a la funcion"<<endl;
  26.  
  27.     x=px;
  28.     y=py;
  29.     volumen=vol;
  30.    
  31.     if(col!=NULL){
  32.         color=new char[strlen(col)+1];
  33.    
  34.         //cout<<"COL "<<color<<endl;
  35.  
  36.         if(color==NULL){
  37.            
  38.             return;
  39.         }
  40.  
  41.     //if(color !=NULL){
  42.         //cout<<"llego aqui"<<endl;
  43.         Convertir(col,color);
  44.         //strcpy(color,col);
  45.         //cout<<"salgo?"<<endl;
  46.     //}
  47.     }
  48.     else{
  49.         color=NULL;
  50.         return;
  51.     }
  52.  
  53.     //cout<<"salgo de la funcion"<<endl;
  54.     //cout<<"color "<<color<<endl;
  55.  
  56. }
  57.  
  58.  
  59.  

No libero bien la memoria?
me pueden ayudar?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #1 en: Miércoles 28 de Octubre de 2009, 20:18 »
0
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[].

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #2 en: Miércoles 28 de Octubre de 2009, 21:04 »
0
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[].

pero es que no lo entiendo, donde tengo que hacer delete,,..no lo veo...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #3 en: Miércoles 28 de Octubre de 2009, 22:18 »
0
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).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #4 en: Miércoles 28 de Octubre de 2009, 22:53 »
0
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).

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?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #5 en: Miércoles 28 de Octubre de 2009, 22:59 »
0
Si; si, esta mal; no se quejaria si hicieras las reservas y liberaciones de a pares.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pacorubio77

  • Miembro MUY activo
  • ***
  • Mensajes: 207
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #6 en: Miércoles 28 de Octubre de 2009, 23:53 »
0
Cita de: "Eternal Idol"
Si; si, esta mal; no se quejaria si hicieras las reservas y liberaciones de a pares.

Esta mal? como hacer las reservas y liberaciones de a pares? perdona pero no entiendo...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: No estoy eliminando bien la memoria dinamica
« Respuesta #7 en: Miércoles 28 de Octubre de 2009, 23:58 »
0
Suficiente, tenes que usar delete[], sino entendes eso lo lamento mucho pero mejor dedicate a otra cosa.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.