c ++中的new运算符有很多面孔,但我对新的位置感兴趣。
假设您在特定的内存位置分配内存
int memoryPool[poolSize*sizeof(int)];
int* p = new (mem) int; //allocates memory inside the memoryPool buffer
delete p; //segmentation fault
在这种情况下,如何正确释放内存? 如果不使用内置类型int,我会使用一些名为myClass的类吗?
myClass memoryPool[poolSize*sizeof(myClass )];
myClass * p = new (mem) myClass ; //allocates memory inside the memoryPool buffer
delete p; //segmentation fault
感谢您的帮助。
答案 0 :(得分:5)
在第一种情况下,使用placement new是没有意义的,因为int
没有构造函数。
在第二种情况下,它是无意义的(如果myClass
是微不足道的)或错误的,因为数组中已有对象。
使用placement new来初始化内存块中的对象,该对象必须适当对齐,并且不得包含(非平凡的)对象。
char memory[enough_bytes]; // WARNING: may not be properly aligned.
myClass * c = new (memory) myClass;
完成它之后,你需要通过调用它的析构函数来销毁对象:
c->~myClass();
这将对象的生命周期与其内存的生命周期分开。您可能还需要在某个时刻释放内存,具体取决于您的分配方式;在这种情况下,它是一个自动数组,因此当它超出范围时会自动释放。
答案 1 :(得分:1)
在您的情况下,无需释放它,一旦从函数返回,您的int数组将被释放。你应该只明确地调用你的析构函数:
对 - >〜MyClass的();
保持缓冲区正确对齐使用std :: aligned_storage,例如在这里查看:
http://www.cplusplus.com/reference/type_traits/aligned_storage/