Ich habe folgende Memberfunktion:Wenn der Copykonstruktor für den Rückgabewert geschieht
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
RAIIMutex
ist eine Hilfsklasse, die einen Mutex recieves und sperrt sie in den Konstruktor und gibt in der destructor.
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 vermeiden, dass die m_person
in einem anderen Thread geändert wird, während es in der Rückkehr kopiert wird, so habe ich die Sperre hinzugefügt.
Aber was passiert zuerst? Erstellt der Compiler zuerst eine Kopie von m_person
oder ruft zuerst den Destruktor myLock
auf?
Theoretisch es easly auflösbar durch so etwas wie dies zu tun:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
Aber ich bin daran interessiert, die Antwort auf meine Frage zu kennen.
Dank
[OT] Sie können ersetzen 'RAIIMutex' mit [' std :: lock_gurad'] (http://en.cppreference.com/w/cpp/thread/lock_guard) – NathanOliver
Der Copy-Konstruktor nicht aufgerufen werden kann überhaupt wegen [elision kopieren] (https://en.wikipedia.org/wiki/Copy_elision). –
@JoachimPileborg Das ist zweifelhaft, da 'm_person' eine Klassenmitgliedsvariable zu sein scheint. – NathanOliver