문제

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