对多态unique_ptr使用新放置
Using placement new for a polymorphic unique_ptr
我读了这篇文章,关于使用放置新来重置boost::shared_ptr
,同时避免额外的内存分配,并假设可以为std::unique_ptr
做同样的事情,如果不是类似的话?我的问题是,当std::unique_ptr
是Base*
类型并且因此可以指向任何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 会在您已经拥有的内存中构造一个对象。 您需要确保内存足够大,可以容纳您正在构建的对象。
相关文章:
- 使用新行和不使用新行读取文件
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 遇到新行时,有没有办法停止istream_iterator
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 计算缩放多边形的比例,得到给定的多边形面积
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- CLANG 编译器 说:变量"PTR"可能未初始化
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- OpenSSL:当输出ptr为空时,BIGNUM的bin2bn不会分配新的BIGNUM
- C++,打开和编辑文本文件中的数字数据,并将结果放入新文件中
- 将 int 放入 char 数组是否在法律上需要新的放置
- 如何将未排序数组的排序索引放入新数组中
- 为什么我会在不存储 ptr 的情况下调用新
- 视觉计数重复,并将唯一条目放入数组 [C++] 中的新数组中
- 非ptr新声明符中的错误表达式
- c++将行getline放入数组中,用新行分隔
- 读取文件夹中的所有文件,然后将每个文件及其匹配项放入新的excel文档中.是否可以用c++
- Visual Studio将新文件放入错误的目录中