对多态性使用 placement new unique_ptr
Using placement new for a polymorphic unique_ptr
我阅读了 this post 关于使用 placement new 重置 boost::shared_ptr
同时避免额外的内存分配,并假设相同的,如果不相似,可以为 std::unique_ptr
完成?我的问题是,当 std::unique_ptr
的类型为 Base*
并且可以指向任何 Derived*
时,如果 Derived
[=22],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
对象,你将不得不为一个对象分配足够的 space。
Placement new 在您已经拥有的内存中构造一个对象。您有责任确保内存足够大以容纳您正在构建的对象。
我阅读了 this post 关于使用 placement new 重置 boost::shared_ptr
同时避免额外的内存分配,并假设相同的,如果不相似,可以为 std::unique_ptr
完成?我的问题是,当 std::unique_ptr
的类型为 Base*
并且可以指向任何 Derived*
时,如果 Derived
[=22],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
对象,你将不得不为一个对象分配足够的 space。
Placement new 在您已经拥有的内存中构造一个对象。您有责任确保内存足够大以容纳您正在构建的对象。