我读了这篇文章,关于使用放置新来重置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
对象,则必须为一个对象分配足够的空间。
放置 new 会在您已经拥有的内存中构造一个对象。 您需要确保内存足够大,可以容纳您正在构建的对象。