nit*_*oid 3 c++ smart-pointers new-operator c++11
我读过这篇文章关于使用placement new来重置a boost::shared_ptr同时避免额外的内存分配,并假设可以为a做同样的,如果不相似的话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;
}
Run Code Online (Sandbox Code Playgroud)
这不会起作用.一个Foo对象规模过大,以适应分配的内存Bar对象.如果你想bp指向一个Foo对象,你将不得不为一个对象分配足够的空间.
Placement new在您已拥有的内存中构造一个对象.确保内存足够大以容纳您正在构建的对象,这取决于您.
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |