Вопрос

there are quite a few faces for the new operator in c++, but I'm interested in placement new.

Suppose you allocate memory at a specific memory location

 int memoryPool[poolSize*sizeof(int)];
 int* p = new (mem) int; //allocates memory inside the memoryPool buffer

 delete p; //segmentation fault 

How can I correctly deallocate memory in this case? What if instead of built-in type int I would use some class called myClass?

 myClass memoryPool[poolSize*sizeof(myClass )];
 myClass * p = new (mem) myClass ; //allocates memory inside the memoryPool buffer

 delete p; //segmentation fault 

Thanks for your help.

Это было полезно?

Решение

In the first case, there's no point in using placement new, since int doesn't have a constructor.

In the second case, it's either pointless (if myClass is trivial) or wrong, since there are already objects in the array.

You use placement new to initialise an object in a block of memory, which must be suitably aligned, and mustn't already contain a (non-trivial) object.

char memory[enough_bytes];  // WARNING: may not be properly aligned.
myClass * c = new (memory) myClass;

Once you've finished with it, you need to destroy the object by calling its destructor:

c->~myClass();

This separates the object's lifetime from that of its memory. You might also have to release the memory at some point, depending on how you allocated it; in this case, it's an automatic array, so it's automatically released when it goes out of scope.

Другие советы

In your case there is no need to deallocate it, your int array will be deallocated once you return from your function. You should only call explicitly your destructor:

p->~myclass();


to keep you buffer correctly aligned use std::aligned_storage, look in here for example:

http://www.cplusplus.com/reference/type_traits/aligned_storage/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top