Mögliche memory leak mit C++ - string

Betrachten Sie das folgende C++ - Programm:

#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();
}

Läuft dieser durch valgrind zeigt (einige Ausgabe gekürzt aus Platzgründen):

==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

Wie Sie sehen können, gibt es eine Möglichkeit, dass 26 bytes reserviert auf dem heap waren verloren. Ich weiß, dass die std::string Klasse hat ein 12-byte-struct (zumindest auf meinem 32-bit x86 Architektur-und GNU-compiler 4.2.4), und "Hallo, Welt!" mit einem null-terminator 14 bytes. Wenn ich es richtig verstanden habe, die 12-byte-Struktur enthält einen Zeiger auf die Zeichenkette, die zugewiesene Größe, und die Referenz-Zählung (jemand korrigiert mich wenn ich hier falsch).

Nun meine Fragen: Wie sind C++ - strings gespeichert, die mit Rücksicht auf den stack/heap? Funktioniert ein stack-Objekt existiert für eine std::string (oder andere STL-Container) wenn deklariert?

P. S. ich hab irgendwo gelesen, dass valgrind kann Bericht ein false positive ist ein Speicherleck in einige C++ - Programme, die mit STL-Containern (und "fast-Container" wie std::string). Ich bin nicht allzu besorgt über das Leck, aber es tut, wecken meine Neugier in Bezug auf STL-Container und Speicher-management.

  • Warum fordern Sie die()?!
  • Ich schrieb die die() Funktion zum trennen der exit(0) Anruf von main(). Mein Programm hat jetzt um die Kontrolle zu übertragen, eine Funktion, in der die exit(0) Funktion "den Stecker zieht" auf diesem Programm die Ausführung. Bedenken Sie dieses Programm dient keinem nützlichen Zweck für andere als wissenschaftliche Gründe.
  • Mein Punkt ist, dass die() bewirkt, dass die Lecks in den ersten Platz. Wenn Sie beugte sich auf ein die() drin, zumindest setzen Sie die Zeichenfolge in Ihren eigenen Bereich.
  • In anderen Worten, "schoss ich mir selbst in den Fuß und ich ausgetreten." Mein Tipp - verwenden Sie ein tourniquet.
InformationsquelleAutor pr1268 | 2010-11-22
Schreibe einen Kommentar