// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
如上,查看gcc中stl的源代码的实现方式。placement new 只是返回__p指针。若
class XX
{
//define ctor,dctor here
//data member
};
char buf[sizeof(XX)];
XX* ptr = new(buf) XX();
像上面这样使用placement new,请问XX是如何在那个指定的内存buf上完成构造的呢?明明只是把指针返回了啊。
우선 여기서 호출하는 new 게재위치는 new 헤더 파일에 정의된 new 게재위치가 아닙니다. ::operator new(...);를 작성해야 합니다.
그런 다음 이 배치 new와 관련하여 C 표준에는 다음 명령문(C 11)이 있습니다.
18.6.1.3 배치 양식 [new.delete.placement]
1 이 함수는 예약되어 있으며 C 프로그램입니다. 표준 C 라이브러리(17.6.4)의 버전을 대체하는 함수를 정의할 수 없습니다. (3.7.4)의 조항은 연산자 new 및 연산자의 예약된 배치 형식에 적용되지 않습니다. 삭제하세요.
일반적인 개념은 이러한 기능이 해당 위치에 예약되어 있어 현재로서는 사용할 수 없다는 것입니다.
구조를 초기화하는 방법을 고려하세요.
메모리가 할당되어 있는 한 이 메모리를 원하는 유형으로 reinterpret_cast할 수 있습니다. 이 프로세스를 통해 클래스의 멤버 변수가 고유한 메모리 공간을 갖게 된 다음 이 유형의 생성자를 호출할 수 있습니다. 원칙. 새로운 게재위치를 수동으로 구현할 수도 있습니다