使用placement new作为多态unique_ptr

时间:2017-05-12 22:02:33

标签: c++ c++11 new-operator smart-pointers

我阅读了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;
}

1 个答案:

答案 0 :(得分:5)

这不会起作用。 Foo对象太大而无法放入为Bar对象分配的内存中。如果您希望bp指向Foo对象,则您必须为其分配足够的空间。

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