2016-05-06 12 views
1

Ich habe eine etwas spezifische Frage bezüglich Destruktoren in C++. Es ist viel einfacher zu erklären, was ich mit Code anfordere. Grundsätzlich mag ich etwas ähnliches (aber nicht genau) zu, dies zu tun:C++ Ist Destruktor Verhaltensstandard für Funktionsargumentprovisorien?

foo(bar().ptr); 

In diesem Beispiel der Zeiger auf dynamische Speicher innerhalb des Objekts von zurück ‚Bar()‘. Wir können annehmen, dass der Zeiger ein Char * von der Einfachheit ist. Ich möchte sicher sein, dass die Daten, auf die "ptr" zeigt, während der Ausführung von foo() existieren. Nun zu konkretisieren was ich meine in Code:

foo(char* ptr) 
{ 
    // do stuff with *ptr 
} 

obj bar() 
{ 
    obj thing; 

    return thing; 
} 

struct obj 
{ 
    char* ptr; 

    obj() 
    { 
     ptr = new char[1]; 
    } 

    ~obj() 
    { 
     delete[] ptr; 
    } 
}; 

Jetzt funktioniert das in Visual Studio ohne vollständige Optimierungen. Ich bin paranoid und möchte 100% Vertrauen in diese Sache haben. Dieser Code muss auch unter Linux laufen (kompiliert mit gcc). Streng genommen x86.

Dies ist etwas subtil, also dachte ich, ich würde fragen, ob dieses Verhalten Standard ist. Es würde scheinen, wie ein Compiler würde wollen, um sicherzustellen, dass dies funktioniert.

Danke!

Antwort

4

Ja, Sie haben die Garantie. Provisorien leben bis zum Ende des Ausdrucks, bis in Ihrem Fall eine Funktion foo() zurückkehrt.

Konzeptionell ist der Fall nicht von

void x(const char*); 

x(std::string("String").c_str()); 

Und das ist altehrwürdige Praxis!

Als eine Randnotiz ist Ihre Smart-Pointer-Klasse extrem schlecht geschrieben, aber ich nehme an, es ist nur zur Veranschaulichung und nicht der echte Code.

+0

Haha, guter Punkt mit c_ptr()! Ja, der obige Code ist nur auf die relevantesten Teile heruntergebrochen. Vielen Dank! – Tom

+0

Eine Randnotiz zu deiner Randnotiz: Die Beispiel-Smart-Pointer-Klasse ist so schlecht geschrieben, dass sie diese Verwendung durchbricht. Das Temporäre wird (ohne RVO) fälschlicherweise von einer lokalen Funktion kopiert, die zerstört wird, bevor das temporäre verwendet wird. –