使用placement new作为多态unique_ptr

nit*_*oid 3 c++ smart-pointers new-operator c++11

我读过这篇文章关于使用placement new来重置a boost::shared_ptr同时避免额外的内存分配,并假设可以为a做同样的,如果不相似的话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;
}
Run Code Online (Sandbox Code Playgroud)

Mil*_*nek 5

这不会起作用.一个Foo对象规模过大,以适应分配的内存Bar对象.如果你想bp指向一个Foo对象,你将不得不为一个对象分配足够的空间.

Placement new在您已拥有的内存中构造一个对象.确保内存足够大以容纳您正在构建的对象,这取决于您.