我读到this post关于使用 Placement new 重置 boost::shared_ptr
同时避免额外的内存分配,并假设可以对 std::unique_ptr
执行相同的操作(如果不相似的话) ?我的问题是,当 std::unique_ptr
的类型为 Base*
时,因此可以指向任何 Derived*
,placement如果
会按预期工作吗?
可能是这样的:Derived
类的大小不同,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 会在您已经拥有的内存中构造一个对象。您需要确保内存足够大以容纳您正在构造的对象。
关于c++ - 使用placement new 来实现多态unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43947054/