Ich habe die folgende Elementfunktion:
%Vor% RAIIMutex
ist eine Hilfsklasse, die einen Mutex erhält und im Konstruktor sperrt und im Destruktor freigibt.
m_person
ist vom Typ Person
(etwas sehr klein). Andere Funktionen in anderen Threads können dieses Mitglied ändern.
Ich möchte m_person
nach Wert zurückgeben (eine Kopie zurückgeben) und natürlich möchte ich die Situation vermeiden, in der m_person
in einem anderen Thread geändert wird, während sie in die Rückgabe kopiert wird, also habe ich die Sperre hinzugefügt .
Aber was passiert zuerst? Erstellt der Compiler zuerst eine Kopie von m_person
oder ruft zuerst der Destruktor von myLock
auf?
Theoretisch ist es einfach lösbar, indem man so etwas macht:
%Vor%Aber ich bin daran interessiert, die Antwort auf meine Frage zu wissen.
Danke
Die Kopierinitialisierung des zurückgegebenen Wertes wird vorher bearbeitet.
Aus dem Standard .6.3/3 The return statement [stmt.return]
(Hervorhebung von mir)
Die Kopierinitialisierung der zurückgegebenen Entität wird vor der Sequenz sequenziert Zerstörung von Provisorien am Ende des Ausdrucks erstellt durch den Operanden der Rückkehr Aussage, die wiederum ist vor der Zerstörung lokaler Variablen (6.6) des Blocks sequenziert Einfügung der return-Anweisung .
Destruktoren lokaler Objekte werden nach 'der letzten Zeile Ihres Codes' aufgerufen. Hier ist ein relevantes Zitat aus Standard (3.7.3 / 3):
Wenn eine Variable mit automatischer Speicherdauer initialisiert ist oder a Destruktor mit Nebenwirkungen, es soll nicht vor dem Ende zerstört werden von seinem Block , noch sollte es als eine Optimierung beseitigt werden, selbst wenn es scheint unbenutzt zu sein, außer dass ein Klassenobjekt oder seine Kopie / Verschiebung möglich ist eliminiert werden, wie in 12.8 spezifiziert.
Tags und Links c++ language-lawyer return