C++ 新操作符如何调用类的构造函数?
我知道,新操作符将调用类的构造函数C++ 新操作符如何调用类的构造函数?,c++,C++,我知道,新操作符将调用类的构造函数 但是它是如何发生的,底层技术用于此目的。编译器为此生成机器代码。当编译器看到 CSomeClass* object = new CSomeClass(); (new语句)它生成的代码调用相应的操作符new()(分配内存),调用正确的构造函数,在异常情况下调用所有完全构造的子对象的析构函数,在构造过程中发生异常时调用操作符delete()。所有这些都是由C++编译器为简单的语句生成的额外的机器代码来完成的。 < P>这里是我的想象: T* the_new_op
但是它是如何发生的,底层技术用于此目的。编译器为此生成机器代码。当编译器看到
CSomeClass* object = new CSomeClass();
(new语句)它生成的代码调用相应的
操作符new()
(分配内存),调用正确的构造函数,在异常情况下调用所有完全构造的子对象的析构函数,在构造过程中发生异常时调用操作符delete()
。所有这些都是由C++编译器为简单的语句生成的额外的机器代码来完成的。 < P>这里是我的想象:
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;
}
(*)从技术上讲,它并不是真的调用placement new,但只要不重载它,心智模型就可以正常工作:)调用构造函数的并不是真正的new操作符。编译器更需要翻译以下行:
MyClass * mine = new MyClass();
具体如下:
MyClass * mine = malloc(sizeof(MyClass)); // Allocates memory
mine->MyClass(); // Calls constructor
其他答案已经指出的其他错误处理代码。这是非常简化的,并没有反映出当抛出异常时,所有完全构造的子对象都在其上运行析构函数这一事实。虽然我无法想象你如何在预udocode中说明这一点。@sharp但无论内存来自何处,任何构造函数都会这样做。新操作符不需要特别做什么。不,从来都不是
malloc()
-operator new()
。很大的区别(例如,您可以为每个类重载操作符new()
)。是的,但为了简单起见,我使用了malloc()
,并试图指出这只是分配一堆内存的问题。没有别的了。重载operator new
是更高级的注意事项,我不会用它来解释当前较低级别的问题。遗憾的是,malloc
这个名称比operator new
更适合这个目的,因为后者经常与新操作符混淆……:(请看一个类似的问题。基本上,您需要理解有一个新表达式和一个新运算符,它们是相关的,但不相同。一个新表达式首先调用运算符new,然后调用构造函数。