这是我的想象:
T* the_new_operator(args)
{
void* memory = operator new(sizeof(T));
T* object;
try
{
object = new(memory) T(args); // (*)
}
catch (...)
{
operator delete(memory);
throw;
}
return object;
}
Run Code Online (Sandbox Code Playgroud)
(*)从技术上讲,它并不是真正调用placement-new,但只要你没有超载,那么mental model就可以了:)
编译器为此生成机器代码。当编译器看到
CSomeClass* object = new CSomeClass();
Run Code Online (Sandbox Code Playgroud)
(new 语句)它生成的代码调用适当的operator new()(分配内存),调用正确的构造函数,在发生异常时调用所有完全构造的子对象的析构函数,operator delete()在构造期间发生异常时调用。所有这些都是由 C++ 编译器为该简单语句生成的额外机器代码完成的。