Lebensdauer temporärer Objekte in C
C stellt sicher, dass die Lebensdauer einer temporären Variablen bis zum Ende des vollständigen Ausdrucks reicht, in dem sie erstellt wurde. Dies gilt für temporäre Objekte wie solche, die in Funktionsaufrufen erstellt werden, ohne dass sie als Parameter übergeben werden.
Betrachten Sie beispielsweise die folgende Klasse:
class StringBuffer { public: StringBuffer(std::string& str) : m_str(str) { m_buffer.push_back(0); } ~StringBuffer() { m_str = &m_buffer[0]; } char* Size(int maxlength) { m_buffer.resize(maxlength + 1, 0); return &m_buffer[0]; } private: std::string& m_str; std::vector<char> m_buffer; };
Wenn wir diese Klasse wie folgt verwenden:
// Crusty old API that cannot be changed void GetString(char* str, int maxlength); std::string mystring; GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);
Der Destruktor für das temporäre StringBuffer-Objekt wird aufgerufen, nachdem GetString zurückgegeben wurde. Dieses Verhalten wird durch den C-Standard garantiert und ermöglicht die zuverlässige Verwendung temporärer Objekte in Funktionsaufrufen.
Der Standard legt fest, dass die Lebensdauer eines temporären Objekts bis zum Ende des vollständigen Ausdrucks reicht, also am äußersten Ende Ausdruck, der nicht Teil eines anderen Ausdrucks ist. In diesem Fall ist der vollständige Ausdruck der Funktionsaufruf, sodass die Lebensdauer des temporären Objekts bis zur Rückkehr der Funktion verlängert wird.
Diese Garantie ist entscheidend für Ausdrucksvorlagen, die Verweise auf temporäre Objekte innerhalb komplexer Ausdrücke enthalten können. Es stellt sicher, dass die Objekte gültig bleiben, bis der gesamte Ausdruck ausgewertet ist.
Das obige ist der detaillierte Inhalt vonWie lange leben temporäre C-Objekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!