Ist der folgende Code zulässig? Meine Sorge ist die Verwendung der .release
Methode, nachdem das Objekt in der Start
Methode zerstört worden ist.Freigabe eines unique_ptr, nachdem das Objekt zerstört wurde
class Foo
{
public:
Foo()
{
std::cout << "Foo ctor\n";
}
~Foo()
{
std::cout << "Foo dtor\n";
}
void Start()
{
std::unique_ptr<Foo> ptr(this);
}
};
int main(int argc, char* argv[])
{
auto ptr = std::make_unique<Foo>();
ptr->Start();
ptr.release();
}
Ich versuchte dies in vs12 und es hat sich nicht beklagen.
die perfekte Weg, um das eigene Bein zu schießen – user3159253
temporäre Instanz in 'Start()' wird zerstört werden, wenn 'Start()' abgeschlossen ist, im Wesentlichen löschen 'this' – user3159253
Da der Zeiger ist' release() 'd unmittelbar danach, nichts besonders gefährlich passiert, aber zwischen 'ptr-> Start()' completion und 'ptr.release()' invocation 'ptr' besitzt das zerstörte Objekt, das definitiv co führen zu Abstürzen und Speicherbeschädigungen. – user3159253