Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: amchacon en 9 Agosto 2013, 14:06 pm



Título: Memory leak con strings
Publicado por: amchacon en 9 Agosto 2013, 14:06 pm
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class foo
  5. {
  6.  
  7.  
  8. public:
  9.      string str;
  10.    foo() : str(1000000,'a')
  11.    {
  12.  
  13.    }
  14.    ~foo()
  15.    {
  16.        cout<<"Destructor invocado";
  17.    }
  18. };
  19.  
  20. int main()
  21. {
  22.  
  23.  
  24.    cout << "Presione para construir f";
  25.    cin.get();
  26.  
  27.  
  28.    foo* f = new foo;
  29.  
  30.  
  31.    cout << "Presione para destruir f";
  32.    cin.get();
  33.  
  34.    delete f;
  35.  
  36.    cout << "Presione para salir del programa";
  37.    cin.get();
  38. }

¿Por qué la memoria no se libera al destruir el objeto foo? *_*


Título: Re: Memory leak con strings
Publicado por: Eternal Idol en 9 Agosto 2013, 15:11 pm
¿En base a que llegas a esa conclusion? Dudo que sea asi.


Título: Re: Memory leak con strings
Publicado por: amchacon en 9 Agosto 2013, 15:13 pm
¿En base a que llegas a esa conclusion? Dudo que sea asi.
Mirando el consumo del programa en el administrador de tareas


Título: Re: Memory leak con strings
Publicado por: Eternal Idol en 9 Agosto 2013, 15:25 pm
No se cuales columnas estaras viendo pero si depuras y/o desensamblas el programa podras ve como no es correcta tu conclusion.

Por ejemplo dentro del destructor de foo y antes de salir se llama a:
call   ILT+570(??1?$basic_stringDU?$char_traitsDstdV?$allocatorD

que a su vez salta a

ILT+570(??1?$basic_stringDU?$char_traitsDstdV?$allocatorD:
jmp std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >

Si lo depuras podes ver como dentro del string el puntero a memoria que use (yo estoy en VC++ y es _Bx->_Ptr) deja de ser valido.


EDITO

Con 10mb tal vez lo veas mas claro:

Código
  1. foo() : str(10485760/*1000000*/,'a')

1) Espacio de trabajo: 2040KB Memoria: 520KB
2) Espacio de trabajo: 12312KB Memoria: 10784KB
3) Espacio de trabajo: 2048KB Memoria: 520KB