对多态unique_ptr使用新放置

Using placement new for a polymorphic unique_ptr

本文关键字:新放 ptr 多态 unique      更新时间:2023-10-16

我读了这篇文章,关于使用放置新来重置boost::shared_ptr,同时避免额外的内存分配,并假设可以为std::unique_ptr做同样的事情,如果不是类似的话?我的问题是,当std::unique_ptrBase*类型并且因此可以指向任何Derived*时,如果Derived类的大小不同,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对象,则必须为一个对象分配足够的空间。

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