쉽게이 새로운 배치를 사용할 수 있습니다
MyClass* p = new (area) MyClass;
이 두 가지 문제가 있습니다 당신이 알고 있어야하지만 :
- 는 보장이 없다 할 것이다 area``것을 정확하게 'MyClass`에 맞춰졌습니다. 나는 일반적으로 노동 조합을 통해 이것을 해결한다.
union
{
double dummyForAlignment;
// Any other types which might be necessary...
unsigned char area[2000];
};
이것은 매우 특별하다; 유형을 확인하는 데 공식적인 보장은 없습니다. 실제로,`double` 대신에, 나는 기본형 대부분의 유니온을 사용합니다. 그리고 확실한 몇 가지 포인터가 있습니다.
- 정상적인 데이터 멤버와 마찬가지로
new
을 사용했기 때문에 컴파일러에서 파괴를 처리하지 않습니다.
p->~MyClass();
즉, 의 개체 수와 할당 된 개체 수를 추적해야한다는 것을 의미합니다. 즉, 이 소멸자를 명시 적으로 호출합니다.
이 기술의 단점은 방금 언급 한 두 가지 점입니다. 또한 구성된 개체에 대한 형식화 된 포인터를 유지하지 않으면 에 디버거에서 문제를 볼 수 있습니다. 여전히 특정 용도로는 유용한 기술입니다. 기본 생성자가 필요 없도록하기 위해 Fallible
클래스에서 사용합니다. 표준 컨테이너가 필요하며 물론 사전 표준 벡터 또는 배열 클래스가 일반적으로 사용됩니다. 다양한 변형 클래스에도 유용합니다. 예를 들어, boost::variant
에서 사용되는 것으로 가정합니다.
왜 그렇게하고 싶습니까? – Anycorn
힙을 특정 크기로 만들고 싶습니다. – bhuwansahni
[placement new()] (http://stackoverflow.com/questions/222557/cs-placement-new). – iammilind