对多态性使用 placement new unique_ptr

Using placement new for a polymorphic unique_ptr

我阅读了 this post 关于使用 placement new 重置 boost::shared_ptr 同时避免额外的内存分配,并假设相同的,如果不相似,可以为 std::unique_ptr 完成?我的问题是,当 std::unique_ptr 的类型为 Base* 并且可以指向任何 Derived* 时,如果 Derived [=22],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 对象,你将不得不为一个对象分配足够的 space。

Placement new 在您已经拥有的内存中构造一个对象。您有责任确保内存足够大以容纳您正在构建的对象。