在已分配的内存上调用构造函数

Ben*_*Ben 26 c++ constructor

这是一个简短的问题:

使用C++,如何在已经分配的内存区域上调用构造函数?

Ant*_*eru 41

您可以使用placement new构造函数,它接受一个地址.

Foo* foo = new (your_memory_address_here) Foo ();
Run Code Online (Sandbox Code Playgroud)

请查看C++ FAQ liteMSDN中的更详细说明.你需要确保内存正确对齐的唯一方法(malloc应该返回正确对齐任何内存的内存,但要注意SSE之类的东西,可能需要对齐到16字节边界左右).

  • 对于偶然发现这一点的其他人:我必须在#include <new>之前做到这一点 - 如果不这样做,g ++会抛出一堆无用的"无匹配函数"错误.[这个](http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10)是有关我的解决方案的新信息(也是C++常见问题解答). (6认同)
  • “唯一的事情”——还有其他问题,例如重用包含具有非平凡析构函数的活动对象的内存位置可能会导致未定义的行为。[请参阅此问题](/sf/ask/3009820831/)了解更多详细信息 (2认同)

Kon*_*lph 5

请注意,在调用placement之前new,您需要在内存上调用析构函数 - 至少如果该对象具有非平凡的析构函数或包含具有的成员.

对于objFoo的对象指针,可以显式调用析构函数,如下所示:

obj->~Foo();
Run Code Online (Sandbox Code Playgroud)

  • 为什么我们应该在进行新的放置之前在新分配的内存上调用析构函数?我不明白...... (2认同)