Ich lese this post über die Verwendung von Placement neu, um eine boost::shared_ptr
zurückgesetzt, während zusätzliche Speicherzuweisungen zu vermeiden, und davon ausgehen, dass das gleiche, wenn nicht ähnlich, für eine std::unique_ptr
getan werden kann? Meine Frage ist, wenn die std::unique_ptr
vom Typ Base*
ist und so auf jede Derived*
zeigen kann, wird die placement new
wie beabsichtigt funktionieren, wenn die Derived
Klassen in der Größe variieren? So etwas wie diese vielleicht:Verwenden der Platzierung neu für eine polymorphe unique_ptr
class Base
{
public:
Base() {}
virtual ~Base(){}
};
class Foo : public Base
{
public:
Foo() : Base() {}
virtual ~Foo(){}
int a;
int b;
};
class Bar : public Base
{
public:
Bar() : Base() {}
virtual ~Bar() {}
int a;
};
int main()
{
std::unique_ptr<Base> bp(new Bar());
bp->~Base(); //edit: call destructor
void* rawP = dynamic_cast<void*>(bp.release());//edit: cast to void*
bp.reset(new(rawP) Foo());
return 0;
}
Beachten Sie, dass Sie den Destruktoraufruf für das ursprüngliche 'Bar'-Objekt verpassen. –
Also das Überschreiben des Speichers, der das 'Bar'-Objekt enthält, beseitigt nicht die Notwendigkeit, es Destruktor zu nennen? – nitronoid
Das ist im Prinzip besorgniserregend: Der zurückgegebene 'Base'-Zeiger zeigt möglicherweise nicht auf den Anfang der Zuweisung. Zumindest sollten Sie die reale Adresse über 'dynamic_cast (rawP)' erhalten. –