2017-09-13 2 views
2

Dies ist eine Variation der delete this Debatte, um mit was passiert mit Zwischen- Methodenaufrufe zu tun.C++ zurück in Methode des gelöschten Objekts

Grundsätzlich, wenn Methode A die Methode B aufruft und Methode B das Objekt zerstört, passiert in der Methode A bei der Rückkehr von B irgendetwas Besonderes? Etwas wie folgt aus:

struct test { 
    void A() { 
    B(); 
    // what happens here besides being unable to dereference `this` anymore? 
    } 
    void B() {delete this;} 
}; 

Kann man davon ausgehen, dass in einem Verfahren eines abgelaufenen Objekt Rückkehr als normal gehen, solange der Speicherplatz des ehemaligen Objekt nicht mit einem weiteren interagierten?

+0

Ja. ]]]]]]]]]]]]] –

Antwort

3

Es ist in Ordnung unterliegt:

  1. Das Objekt muss mit new erstellt wurden. (Beachten Sie, dass eine delete nach einer Platzierung new nicht in Ordnung wäre).

  2. Rufen Sie nach dem Aufruf von delete this; keine Elementfunktionen oder Zugriffsmitglieddaten auf (Funktionen, die aufgrund von Stapelabwicklungen erneut eingegeben wurden, sind in Ordnung).

  3. Versuchen Sie nicht, einen Zeigertyp this zuzuweisen.

Also, in Ihrem Fall, da kein Problem ist (vorausgesetzt, Sie mit 1 konform sind).

+3

Du hast schneller geantwortet, als ich ein passendes Duplikat finden konnte. Das ist kein Lob, übrigens. –

+0

das kam für mich nicht so sehr wegen 'lösche das' sondern wegen eines Garbage Collectors, der parallel zu einer Warteschlange von Objekten lief. Die Art und Weise, wie die Warteschlange verarbeitet wird, beinhaltet zeitweise rekursive Methodenaufrufe. Daher ist es möglich, in meinem Fall zu erkennen, wenn ein Objekt gelöscht wird, und sich nicht um die Interaktion mit toten Objekten zu sorgen. hatte jedoch Zweifel über Stack abwickeln, stellt sich heraus, es ist in Ordnung, wenn Sie vorsichtig sind, danke! –

3

Nichts Schlimmes würde passieren. Natürlich gibt es offensichtliche Dinge Aufmerksamkeit schenken mag:

  • Seien Sie sicher, dass die Objekt this Punkte mit new zugeordnet wurde.
  • Rufen Sie keine anderen Elementfunktionen nach B() auf und greifen Sie nach B() auf keine Mitgliedsvariablen zu.
  • Verwenden Sie nicht this für alles nach B(), nein, nicht einmal der Zeiger selbst.
+1

Würdest du gerne klarstellen, was du mit "besonders" meinst? – Bathsheba

+1

@Bathsheba Ich habe keine Ahnung. –

Verwandte Themen