你能/你如何重新分配使用placement new创建的C++对象?

Gre*_*g K 2 c++ memory-management

我有一个C++对象,它是由宿主应用程序提供的内存缓冲区中的插件创建的,其中placement new运算符的方式类似于以下代码:

MyClass* createObject(void* inNewBlock)
{
  MyClass* elementAddr = static_cast<MyClass*>(inNewBlock);
  new (elementAddr) MyClass(); // Placement new into pre-allocated memory
}
Run Code Online (Sandbox Code Playgroud)

我知道我无法删除以这种方式创建的对象,但是我想知道是否有办法将内存清空并在以后重新分配对象,如果我需要这样:

void removeObject(MyClass* object)
  memset(object, NULL, sizeof(MyClass));
}

void restoreObject(MyClass* object)
{
  new (object) MyClass(); // Placement new into pre-allocated memory
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用.我试过了,当我打电话时,主机应用程序挂起或崩溃restoreObject().我希望有人可以向我解释为什么这不起作用以及可能的替代方案.

Ker*_* SB 7

这太复杂了.当你不再需要它时,你可以简单地销毁它.另外,placement-new参数已经是一个void指针,不需要强制转换.这与标准库分配器的作用非常相似:

MyClass * create(void * addr)
{
  return ::new (addr) MyClass;    // default-initialize
}
MyClass * create(void * addr, const MyClass & x)
{
  return ::new (addr) MyClass(x); // copy-construct from prototype
}

void destroy(MyClass * p)
{
  p->~MyClass();   // you can now reuse the memory
}
Run Code Online (Sandbox Code Playgroud)

没有"恢复"这样的东西; 您可以在内存中创建一个新对象,如果您已正确销毁该对象,则该对象以前被另一个对象使用.

编辑:我添加了另一个构造方法,它可以复制给定对象,以防您的类不是默认构造的.