[英]Using placement new for a polymorphic unique_ptr
我讀過這篇關於使用placement new來重置boost::shared_ptr
同時避免額外的內存分配的文章,並假設對於std::unique_ptr
可以做同樣的,如果不相似的話? 我的問題是,當std::unique_ptr
的類型為Base*
並因此可以指向任何Derived*
,如果Derived
類的大小不同, placement new
是否會按預期工作? 這樣的事情可能是:
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;
}
這不會起作用。 Foo
對象太大而不適合分配給Bar
對象的內存。 如果你想讓bp
指向一個Foo
對象,你將不得不為一個對象分配足夠的空間。
Placement new在您已擁有的內存中構造一個對象。 確保內存足夠大以容納您正在構建的對象,這取決於您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.