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!
Haha, guter Punkt mit c_ptr()! Ja, der obige Code ist nur auf die relevantesten Teile heruntergebrochen. Vielen Dank! – Tom
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. –