wie lösche gelöschte Objekte in C ++

7

Kann der Speicher gelöschter Objekte in C ++ gelöscht werden? Ich möchte dies tun, um einen Coredump im Komponententest zu reproduzieren:

%Vor%     
bob 18.05.2009, 23:25
quelle

7 Antworten

20

Sie sollten den Operator delete wahrscheinlich überschreiben.

Beispiel für die gegebene Klasse B:

%Vor%

BEARBEITEN: Danke littb für das Hinzeigen.

    
beef2k 18.05.2009, 23:31
quelle
3
  

accessBMemberVariable sollte coredump, aber es nicht

Nein, warum sollte es? Es ist durchaus möglich, dass der Speicher, den b belegt hat, jetzt dem CRT gehört, dem CRT, den Ihre Anwendung besitzt. Die CRT kann entscheiden, den Speicher nicht an das OS zurück zu geben. Core-Dumps werden nur ausgeführt, wenn Sie auf Speicher nicht zugreifen, der Ihrer Anwendung gehört.

Wenn Sie den von b belegten Speicher auf Null setzen, kann das in Abhängigkeit vom Typ der Variablen, für die A die Adresse hat, nicht gut sein.

Mein Rat wäre, B auf den Stapel zu legen, das sollte das Feuerwerk hervorbringen ... aber dann wieder nicht ganz so, wie du es erwarten würdest ...

Wenn Sie also wirklich einen Core-Dump wollen, sollten Sie die OS-Funktionen verwenden, um Speicher zuzuordnen und freizugeben:

%Vor%     
Andreas Magnusson 19.05.2009 00:07
quelle
2

Ein anderes Poster schlug vor:

%Vor%

Bitte tu das nicht !!! Schreibzugriffe auf Leerzeichen, die an den Speichermanager zurückgegeben werden, sind UNDEFINIERT !!!!

Auch wenn dein Compiler und deine Bibliothek es dir jetzt erlauben, ist es schlimm schlecht. Eine Änderung in der Bibliothek oder Plattform oder sogar ein Update im Compiler wird dich in den Arsch beißen.

Denken Sie an eine Race-Bedingung, bei der Sie b löschen, dann macht ein anderer Thread eine Zuweisung, der Speicher bei b wird ausgegeben, und dann rufen Sie memset auf! Bang, du bist tot.

Wenn Sie den Speicher löschen müssen (was kümmert es), löschen Sie ihn vor dem Löschen löschen.

%Vor%     
James Caccese 18.05.2009 23:33
quelle
2

Verwenden Sie das Placement "neu", wenn Sie können ( Ссылка ). und zerkleinere den Chunk, den du angegeben hast, nachdem du den Objektdestruktor manuell aufgerufen hast.

    
artificialidiot 18.05.2009 23:53
quelle
1

Verwenden Sie die Debugging-Funktionen von malloc / new in Ihrer Umgebung.

Verknüpfen Sie auf MSVC mit den Debug-Laufzeitbibliotheken. Stellen Sie unter FreeBSD MALLOC_OPTIONS so ein, dass die Flags 'Z' oder 'J' angezeigt werden. Lesen Sie auf anderen Plattformen die Dokumentation oder ersetzen Sie sie in einem geeigneten Zuordner mit Debugging-Unterstützung.

Das Aufrufen von memset () nach dem Löschen ist auf so vielen Ebenen einfach schlecht.

    
janm 18.08.2009 11:23
quelle
0

In Ihrem Beispiel schreiben Sie

'A- & gt; accessBMemberVariable' ist das ein Tippfehler? sollte es nicht "a- & gt; accessBMemberVariable" sein?

Angenommen, es ist ein Tippfehler (sonst wirkt das ganze Design etwas komisch).

Wenn Sie überprüfen möchten, ob "a" korrekt gelöscht wurde, ist es wahrscheinlich besser, stattdessen die Art der Zuweisung zu ändern und stattdessen auto_ptrs zu verwenden. Auf diese Weise werden Sie sicher sein, dass Dinge richtig gelöscht werden:

%Vor%

und ein Konstruktor für B in Form von

%Vor%

wo

%Vor%     
Anders K. 19.05.2009 02:21
quelle
-3

Sobald du b gelöscht hast, hast du nicht wirklich die Erlaubnis darüber zu schreiben wo es war. Aber normalerweise kann man damit durchkommen; und Sie werden Code sehen, wo Programmierer memset dafür verwenden.

Der bewährte Weg wäre jedoch, den Destruktor direkt aufzurufen, dann den Speicher zu überschreiben (zB memset ) und dann delete für das Objekt aufzurufen. Das erfordert, dass Ihr Destruktor ziemlich intelligent ist, weil delete den Destruktor aufrufen wird. Der Destruktor muss also erkennen, dass das ganze Objekt nichts anderes ist als 0 und nichts tun:

%Vor%     
Max Lybbert 18.05.2009 23:30
quelle

Tags und Links