Considere el siguiente programa en C++:Posible pérdida de memoria usando C++ cadena
#include <cstdlib> // for exit(3)
#include <string>
#include <iostream>
using namespace std;
void die()
{
exit(0);
}
int main()
{
string s("Hello, World!");
cout << s << endl;
die();
}
La ejecución de este a través valgrind muestra esto (alguna salida recortado por razones de brevedad):
==1643== HEAP SUMMARY:
==1643== in use at exit: 26 bytes in 1 blocks
==1643== total heap usage: 1 allocs, 0 frees, 26 bytes allocated
==1643==
==1643== LEAK SUMMARY:
==1643== definitely lost: 0 bytes in 0 blocks
==1643== indirectly lost: 0 bytes in 0 blocks
==1643== possibly lost: 26 bytes in 1 blocks
==1643== still reachable: 0 bytes in 0 blocks
==1643== suppressed: 0 bytes in 0 blocks
Como se puede ver, hay una posibilidad de que se perdieron 26 bytes asignados en el montón. Sé que la clase std::string
tiene una estructura de 12 bytes (al menos en mi arco x86 de 32 bits y el compilador GNU 4.2.4), y "Hello, World!" con un terminador nulo tiene 14 bytes. Si lo entiendo correctamente, la estructura de 12 bytes contiene un puntero a la cadena de caracteres, el tamaño asignado y el recuento de referencias (alguien me corrige si me equivoco aquí).
Ahora mis preguntas: ¿Cómo se almacenan las cadenas de C++ con respecto a la pila/montón? ¿Existe un objeto de pila para un std::string
(u otros contenedores STL) cuando se declara?
P.S. He leído en algún lugar que valgrind puede informar un falso positivo de una pérdida de memoria en algunos programas C++ que utilizan contenedores STL (y "casi-contenedores" como std::string
). No estoy demasiado preocupado por esta filtración, pero despierta mi curiosidad con respecto a los contenedores STL y la gestión de la memoria.
morir ¿Por qué llamas() ?! – EboMike
@EboMike: Escribí el '' función die() para separar el 'exit (0)' 'llamada desde main()'. Mi programa ahora tiene que transferir el control a una función llamada, en la cual la función 'exit (0)' "desconecta" la ejecución de este programa. Tenga en cuenta que este programa no tiene otro propósito útil que no sea por razones académicas. – pr1268
Mi punto es que die() causa las filtraciones en primer lugar. Si estás decidido a tener un dado() allí, al menos pon el hilo en su propio alcance. – EboMike