Pan*_*rei 4 c++ memory-management new-operator dynamic-memory-allocation
c ++中的new运算符有很多面孔,但我对新的贴片感兴趣.
假设您在特定内存位置分配内存
int memoryPool[poolSize*sizeof(int)];
int* p = new (mem) int; //allocates memory inside the memoryPool buffer
delete p; //segmentation fault
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何正确释放内存?如果不使用内置类型int,我会使用一些名为myClass的类?
myClass memoryPool[poolSize*sizeof(myClass )];
myClass * p = new (mem) myClass ; //allocates memory inside the memoryPool buffer
delete p; //segmentation fault
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
在第一种情况下,使用placement new是没有意义的,因为int没有构造函数.
在第二种情况下,它是无意义的(如果myClass是微不足道的)或错误的,因为数组中已有对象.
您可以使用placement new来初始化内存块中的对象,该对象必须经过适当的对齐,并且不得包含(非平凡的)对象.
char memory[enough_bytes]; // WARNING: may not be properly aligned.
myClass * c = new (memory) myClass;
Run Code Online (Sandbox Code Playgroud)
一旦完成它,你需要通过调用它的析构函数来销毁对象:
c->~myClass();
Run Code Online (Sandbox Code Playgroud)
这将对象的生命周期与其内存的生命周期分开.您可能还需要在某个时刻释放内存,具体取决于您的分配方式; 在这种情况下,它是一个自动数组,因此当它超出范围时会自动释放.