Gehen Sie einen schnelleren, intelligenteren Weg zur KI-gestützten C/C++-Testautomatisierung. Erfahren Sie mehr >>
Suchen eines Speicherverlusts in C oder C ++
Aufgrund der Fülle an Daten kann es schwierig sein, Speicherlecks in der Softwareentwicklung zu identifizieren. In diesem Beitrag erfahren Sie, wie Sie mit einem Programm zur Laufzeitfehlererkennung Speicherlecks in C und C++ finden.
Aufgrund der Fülle an Daten kann es schwierig sein, Speicherlecks in der Softwareentwicklung zu identifizieren. In diesem Beitrag erfahren Sie, wie Sie mit einem Programm zur Laufzeitfehlererkennung Speicherlecks in C und C++ finden.
Speicherlecks in Programmiersoftware können aufgrund der großen Datenmenge schwer zu lokalisieren sein. In diesem Artikel erfahren Sie, wie Sie mithilfe eines Tools zur Laufzeitfehlererkennung Speicherlecks in C- und C++-Anwendungen finden.
Wenn Sie mit einem Speicherverlust konfrontiert sind, verfügen C ++ und C über eine Reihe von Tools zur Laufzeiterkennung, die möglicherweise die Leistung verbessern können. Diejenigen, die Code in C oder C ++ schreiben, sind mit Speicherlecks vertraut. Wikipedia bietet die folgende Definition:
In der Informatik ist ein Speicherleck eine Art Ressourcenleck, das auftritt, wenn ein Computerprogramm die Speicherzuweisungen falsch verwaltet, sodass nicht mehr benötigter Speicher nicht freigegeben wird. Ein Speicherleck in C kann auch passieren, wenn ein Objekt im Speicher abgelegt ist, auf das jedoch vom laufenden Code nicht zugegriffen werden kann.
Mit anderen Worten, Lecks bedeuten, dass dynamisch zugewiesener Speicher nicht an das Betriebssystem zurückgegeben werden kann, da das Programm keine Zeiger mehr enthält, die darauf zugreifen können. Sie haben die Kontrolle über dieses Speicherelement unabhängig von der Größe verloren und können nicht mehr darauf zugreifen oder es freigeben.
Eines der besten Beispiele für dieses Verhalten können Sie sehen, wenn Sie das unten gezeigte Programm „Hallo Welt“ ausführen.
/* * Datei: hallo.c */ #include #enthalten int main(int argc, char *argv[]) { char *string, *string_bisher; int i, Länge; Länge = 0; für(i=0; i
Wenn wir dieses Programm mit den folgenden Argumenten ausführen:
Hallo, das ist ein Test
Wenn wir den Status des Programms in Zeile 25 untersuchen, bevor wir den Aufruf von malloc zum zweiten Mal ausführen, stellen wir Folgendes fest:
Diese Zuordnungen sind nachstehend schematisch dargestellt. Beide Variablen zeigen auf Blöcke mit dynamisch zugewiesenem Speicher.
Die nächste Aussage:
string_bisher = string;
erstellt beide Variablen, die auf den längeren Speicherblock zeigen, wie unten gezeigt:

Sobald dies geschieht, gibt es jedoch keinen verbleibenden Zeiger mehr, der auf den kürzeren Block verweist. Selbst wenn Sie es wollten, gibt es keine Möglichkeit, den Speicher, auf den string_so_far zuvor verwiesen hat, zurückzufordern; er ist nun dauerhaft reserviert. Dies wird als „Speicherleck“ bezeichnet. In C++ und C treten diese Probleme häufig auf, daher ist es wichtig, sie frühzeitig zu erkennen.
Obwohl es keine Schaltfläche zum Erkennen von Speicherlecks gibt, verfügen C++ und C über Laufzeiterkennungstools, die hilfreich sein können. Diese Art von Fehler kann mit Tools zur Speicherfehlererkennung wie Parasoft Insure++ diagnostiziert werden. Dies wird unten dargestellt:
[hello.c: 25] ** LEAK_ASSIGN ** >> string_so_far = string; Speicherverlust aufgrund einer Neuzuweisung des Zeigers: Zeichenfolge Verlorener Block: 0x0804bd68 bis 0x0804bd6f (8 Byte) Zeichenfolge, zugewiesen bei hello.c, 15 malloc () (Schnittstelle) main () hello.c, 15 Stapelverfolgung, bei der der Fehler aufgetreten ist: main ( ) hallo.c, 25
Dieses Beispiel heißt LEAK_ASSIGN, da es verursacht wird, wenn ein Zeiger neu zugewiesen wird. (PS Andere Speicher-Debugger unterscheiden häufig nicht zwischen ausstehendem Speicher und tatsächlich durchgesickertem Speicher, Insure ++ jedoch.) In diesem Fall ist ausstehender Speicher kein fantastischer Speicher, sondern Speicher, den Sie nicht freigegeben haben, im Gegensatz zu Ein tatsächliches Leck, bei dem es sich um Speicher handelt, den Sie nicht freigeben können.
Parasoft Insure++ kann auch mehrere andere Arten von Lecks automatisch erkennen.
| Leckart | Beschreibung |
|---|---|
| LECK_FREI | Tritt auf, wenn Sie einen Speicherblock freigeben, der Zeiger auf andere Speicherblöcke enthält. |
| LEAK_RETURN | Tritt auf, wenn eine Funktion einen Zeiger auf einen zugewiesenen Speicherblock zurückgibt, der zurückgegebene Wert jedoch in der aufrufenden Routine ignoriert wird. |
| LEAK_SCOPE | Tritt auf, wenn eine Funktion eine lokale Variable enthält, die auf einen Speicherblock verweist, die Funktion jedoch zurückkehrt, ohne den Zeiger in einer globalen Variablen zu speichern oder an ihren Aufrufer zurückzugeben. |
Beachten Sie, dass die Fehlermeldung die genaue Quellzeile angibt, in der das Problem auftritt, und nicht nur, wo der Block zugewiesen wurde. Dies ist ein Schlüsselproblem beim Auffinden und Beheben von Speicherlecks. Dies ist äußerst wichtig, da es leicht ist, subtile Speicherlecks in Ihre Anwendungen einzuführen, diese jedoch nur sehr schwer zu finden sind.
Wenn Sie nach einem C++-Tool zum Überprüfen von Speicherlecks suchen, Erfahren Sie hier mehr über Parasoft Insure++.