2 Stimmen

Instrumente fängt nicht gelöschte Objekte ein, wenn das Programm beendet wird

Zum Zweck der Demonstration habe ich diese einfache Konsolenanwendung erstellt:

#include 

class Person {
public:
    int mAge;
};

int main(int argc, const char * argv[])
{
    Person *iPerson = new Person();
    iPerson->mAge = 15;

    std::cout << "Alter: " << iPerson->mAge;
    return 0;
}

Jetzt bin ich mir bewusst, dass Valgrind und CPP Check hier Lecks identifizieren werden, aber bei der Überprüfung von Apples Instruments kann ich bei diesem Code keine Lecks sehen. Dies trotz der Tatsache, dass iPerson nie gelöscht wird.

1voto

Izhaki Punkte 22440

Ich habe es herausgefunden:

  • Ich musste das Snapshot-Intervall auf 1 Sekunde setzen.
  • Ich musste Optimierung für die Release-Version deaktivieren (auf None setzen) (für die Profilerstellung).

Dann basierend auf Justins Antwort und dieser Frage, musste ich meinen Code wie folgt ändern:

#include 
#include 

class Person {
public:
    int mAlter;
};

void CreateLeaks()
{
    // Alle drei Zeilen werden ein Leak erzeugen.
    Person *iPerson = new Person();
    iPerson = new Person();
    iPerson = new Person();
}

int main(int argc, const char * argv[])
{
    CreateLeaks();

    sleep( 2 );
    return 0;
}

Es gibt immer noch einige seltsame Dinge, die passieren. Zum Beispiel, wenn Sie sleep(2) innerhalb von CreateLeaks hinzufügen, fängt Instruments nicht alle Lecks (je nachdem, wo Sie die sleep-Befehle platzieren. Seltsam.

0voto

David L. Punkte 2085

Sie könnten sich Tipps zur Verbesserung der Leckerkennung aus der Mac Developer Library ansehen.

Das statische Analysetool Cppcheck für C/C++-Code könnte ebenfalls hilfreich sein. Für das von Ihnen bereitgestellte Beispiel findet es:

#>cppcheck  so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Speicherleck: iPerson

0voto

justin Punkte 103032

Das Leaks-Instrument führt Schnappschüsse in einer vordefinierten Frequenz durch. Standardmäßig beträgt dieser Wert "jede 10 Sekunden". Dein Programm wird vor Ablauf von 10 Sekunden abgeschlossen. Daher wird das Leak nie erfasst. Du musst die Ausführung nach dem Verlassen des Gültigkeitsbereichs von iPerson aussetzen, damit das Leak erkannt wird. Außerdem, wenn du einfach ein Sleep hinzufügst, während dieser Zeiger noch auf dem Stapel oder in einem Register referenziert wird, wird es kein Leak sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X