我阅读了this post关于使用新的位置来重置boost::shared_ptr
同时避免额外的内存分配,并假设std::unique_ptr
可以做同样的(如果不是相似的话)吗?我的问题是,当std::unique_ptr
的类型为Base*
且可以指向任何Derived*
时,如果placement new
类的变化,Derived
将按预期工作尺寸?
这样的事情可能是:
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;
}
答案 0 :(得分:5)
这不会起作用。 Foo
对象太大而无法放入为Bar
对象分配的内存中。如果您希望bp
指向Foo
对象,则您必须为其分配足够的空间。
Placement new在您已拥有的内存中构造一个对象。确保内存足够大,可以容纳您正在构建的对象。