Tenemos un código como este:

  void main(){
  std::list<int *> ll;
  for(int i=0;i<100;i++)
   {
      int *a = new int[10000];
      ll.push_back(a);
   }
  for(int *b : ll)
  {
     delete [] b;
  }  
 ll.clear();

}

¿Pero el recuerdo no es libre? ¿Por qué? Cuando ejecuta este código, funciona correctamente:

void main(){
 for(int i=0;i<100;i++)
 {
     int *a = new int[10000];
     delete [] a;
 }
}

Superviso la memoria con el comando superior en Linux y la supervisión del sistema, por lo que en el primer código, en primer lugar, la memoria estaba subiendo y luego espero que, por último, la aplicación libere la memoria pero no la memoria libre.

0
ebigood 14 nov. 2017 a las 15:13

2 respuestas

La mejor respuesta

Como han dicho otros, valgrind es la herramienta apropiada para usar cuando se buscan fugas de memoria. El uso de valgrind en su programa muestra que no tiene pérdida de memoria:

    $ valgrind --leak-check=yes ./example 
==3945== Memcheck, a memory error detector
==3945== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==3945== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==3945== Command: ./example
==3945== 
==3945== 
==3945== HEAP SUMMARY:
==3945==     in use at exit: 0 bytes in 0 blocks
==3945==   total heap usage: 200 allocs, 200 frees, 4,002,400 bytes allocated
==3945== 
==3945== All heap blocks were freed -- no leaks are possible
==3945== 
==3945== For counts of detected and suppressed errors, rerun with: -v
==3945== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
3
scott-eddy 14 nov. 2017 a las 12:37

[Superviso la memoria] en Linux con el comando superior y la supervisión del sistema

Este enfoque no le dará un resultado preciso. El comando de Linux top le dice cuánta memoria tiene el proceso, que incluye la memoria que el asignador solicitó al sistema operativo. top no sabe cuánto de esta memoria le ha dado el asignador a su programa, y cuánto se guarda para darle a su programa en el futuro.

Para comprobar si su programa tiene pérdidas de memoria y otros errores relacionados con la memoria, utilice una herramienta de creación de perfiles de memoria, como valgrind. El generador de perfiles detectaría pérdidas de memoria y le informaría de los lugares en su programa que asignaron bloques de memoria que no fueron devueltos al asignador.

Nota: la razón por la que su otro código parece funcionar es que el asignador necesita mucha menos memoria, porque la misma porción de memoria se asigna y desasigna repetidamente en el ciclo.

4
dasblinkenlight 14 nov. 2017 a las 12:27