2009-02-06 2 views

답변

35

주소를 사용하는 게재 위치 new 생성자를 사용할 수 있습니다.

Foo* foo = new (your_memory_address_here) Foo(); 

C++ FAQ lite 또는 MSDN에 대한 자세한 설명을 살펴보십시오. 메모리가 올바르게 정렬되었는지 확인하기 위해 필요한 유일한 것 ( malloc은 올바르게 정렬 된 메모리를 반환하지만 SSE와 같은 16 바이트 경계까지 정렬이 필요할 수 있음)를주의해야합니다.

+3

이 문제를 겪는 다른 사람은 : #include '이 작동하기 전에 - g ++은 도움이되지 않는 "no matching function"오류를 던졌습니다. [This] (http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10)는 새로운 배치 (C++ FAQ)에 대한 정보로이를 이해하는 데 도움이되었습니다. –

6

게재 위치 new을 호출하기 전에 메모리에 소멸자를 호출해야합니다. 최소한 객체에 중요하지 않은 소멸자가 있거나 구성원이 포함되어 있어야합니다. 소멸자가 명시 적으로 호출 할 수 있습니다 Foo 클래스의 객체 포인터 obj에 대한

은 다음과 같습니다

obj->~Foo(); 
+2

새로 배치하기 전에 새로 할당 된 메모리에서 소멸자를 호출해야하는 이유는 무엇입니까? 나는 그것을 얻지 못한다 ... – Malkocoglu

+1

일반적으로 할당되었지만 초기화되지 않은 메모리는 얻지 못한다. 그것이 실제로 당신이 가지고있는 것이라면, 물론 소멸자를 호출해서는 안됩니다. 다른 모든 경우에는 해당 위치에 적절하게 처리해야하는 대상이 이미 있습니다. –

+1

모두 0으로 설정하지 않는 한 메모리를 초기화하지 않습니다. 개체를 초기화합니다. 임의의 메모리에서 dtor를 호출하는 것은 좋지 않습니다. 객체의 컨테이너를 수행하는 경우에만 dtor에 호출하는 것이 좋습니다. 이러한 객체에 비어 있지 않은 가상의 dtor가 있으면 작업을 수행하지 않아도됩니다. –

2

허용 대답 언급 배치 새로운 생성자는 헤더에 정의 된 할당 클래스 전에 오래된 방법입니다. 이제는 C++ 11 스타일로해야합니다 :

allocator<Foo> alloc; 
//Allocate memory for one or n objects 
auto p = alloc.allocate(1); 
//Construct an object of Foo on allocated memory block p, by calling one of Foo's constructors 
alloc.construct(p, args, ...); 

//OK, p now points to a Foo object ready for use... 

//Call Foo's destructor but don't release memory of p 
alloc.destroy(p); 
//Release memory 
alloc.deallocate(p, 1); 

그래, 맞아.