c++ - 使用placement new 来实现多态unique_ptr

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

我读到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/

相关文章:

templates - C++ 具有复杂构造函数的对象的通用构建器方法

c++ - 这样的分配在 C++ 中是个好主意吗

javascript - JS new.target 与 instanceof

java - 字符串是 Java 中的对象,那我们为什么不使用 'new' 来创建它们呢?

c++ - 需要修复我的 Variadic 宏

c++ - 用 vector 的 vector 的元素初始化 vector 的空 vector

c++ - 函数返回期间出现奇怪的段错误

c++ - 错误:C2039: 'iswspace':不是 'std' 的成员,但 std::isspace() 编译正常

c++ - 为什么 clang 不使用 NRVO 对此进行优化?

c++ - Qt避免警告QProcess : destroyed while process still running (Assistant)