2017-10-18 5 views
1

Können sagen, ich habe folgendes:Wann wird eine Mitgliedsfunktion nicht mehr angezeigt?

struct Foo 
{ 
    Foo() : bar([&]{ doSomething();}) 
    std::function<void(void)> bar; 
    void doSomething(){}; 
} 

Und lässt einen Thread sagen ständig von einem Foo Instanz das Stabelement ruft, während ein anderer Thread die Foo Instanz selbst zerstört. Ist es möglich, dass ein Aufruf von bar zu einem ungültigen Funktionsaufruf führt, da der Destruktor von Foo zuerst aufgerufen wird? Führt der Destruktor von Foo Memberfunktionsaufrufe vor der Freigabe aus?

Edit: Sorry, ich hätte etwas genauer sein sollen, wird DoSomething undefiniert, bevor der Destruktor der Bar aufgerufen wird?

+0

Elementvariablen existieren in Objekten. Wenn es kein Objekt gibt, wie könnte die Elementvariable existieren? –

+2

Es liegt in Ihrer Verantwortung sicherzustellen, dass kein Thread ein Objekt zerstört, während ein anderer Thread es verwendet oder verwenden könnte. –

+0

Dies ist übrigens der Hauptgrund, warum ein Objekt seine eigene Zerstörung nicht synchronisieren kann. Wenn Sie 'Destruction Requests' implementieren wollen, dh, ein Objekt kann zur Destruktion aufgefordert werden, während gleichzeitig andere Requests bearbeitet werden, muss dies * extern * und nicht die Klasse selbst synchronisiert werden. – ComicSansMS

Antwort

0

Mitgliedsfunktionen bleiben gültig, bis das Objekt gültig ist. Wenn das Objekt zerstört wird, wird die Elementfunktion ebenfalls zerstört und das Objekt wird zerstört, wenn der Destruktor aufgerufen wird. Daher macht der Aufruf von Destruktor die Mitgliedsfunktionen ungültig. Und wenn Sie nach der Zerstörung eines Objekts eine Member-Funktion aufrufen, führt dies zu undefiniertem Verhalten. Sie müssen also sicherstellen, dass keine Elementfunktion aufgerufen wurde, nachdem das Objekt zerstört wurde.

3

Ist es möglich, dass ein Aufruf von Bar zu einem ungültigen Funktionsaufruf führt, da der Destruktor von Foo zuerst aufgerufen wird?

Ja, es sei denn, Sie stellen sicher, dass das nicht passiert.

Führt der Destruktor von Foo ungültige Memberfunktionsaufrufe vor der Freigabe aus?

Ja. Alle Verweise auf dieses Objekt und seine Unterobjekte werden ungültig, sobald der Destruktor aufgerufen wird.

Beachten Sie, dass Mitglied Funktion ist etwas anderes als das, was Sie haben. Was Sie haben, ist ein Funktions-Wrapper, der ein Member-Objekt ist. Die Unterscheidung macht jedoch keinen Unterschied für die Antwort.

+0

Zur Verdeutlichung: * Invalidate * bedeutet hier, dass es nicht länger gültig ist, eine Memberfunktion auszuführen, sobald der Destruktor gestartet wird. Die Sprache erzwingt das nicht wirklich. Es liegt in Ihrer Verantwortung sicherzustellen, dass dies niemals geschieht. Wenn Sie dies nicht richtig machen, darf das Programm in Ihrem Gesicht explodieren. – ComicSansMS

Verwandte Themen