运营商如何调用类的构造函数?
编译器为此生成机器码。当编译器看到
CSomeClass* object = new CSomeClass();
(新语句)它生成的代码调用适当的operator new()
(其中分配内存),调用合适的构造,在例外的情况下调用所有完全构造子对象的析构函数,调用operator delete()
在施工期间发生异常的情况下。所有这些都是由C++编译器为简单查看语句生成的额外机器代码完成的。
这里是我想象:
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;
}
(*)从技术上讲,它不是真正的呼唤投放新的,但只要你不超载的是,心理优良样板工程:)
这是非常简化的,并没有反映出这样的事实,即当抛出异常时,所有*完全构造的子对象都在运行析构函数。虽然我无法想象你如何能够在预科码中说明这一点。 – sharptooth 2010-05-31 07:24:32
@sharp但是这正是任何构造函数总是这样做的,无论内存来自哪里。新运营商不必专门做这件事。 – fredoverflow 2010-05-31 07:35:43
这不是真正的调用构造函数的新运算符。更是翻译以下行的编译器:
MyClass * mine = new MyClass();
为以下:
MyClass * mine = malloc(sizeof(MyClass)); // Allocates memory
mine->MyClass(); // Calls constructor
与其他错误处理,其他的答案已经注意到代码。
不,不是'malloc()' - 'operator new()'就是所谓的。差别很大(例如,您可以为每个类重载'operator new()')。 – sharptooth 2010-05-31 07:37:46
确实如此,但为了简单起见,我使用了'malloc()',并试图指出它只是分配一堆内存的问题。没有其他的。重载'operator new'是更高级的考虑因素,我不会将这个更低层次的问题作为当前的解释来使用。 – 2010-05-31 07:50:35
不幸的是,'malloc'这个名称比'operator new'好很多,因为后者经常和新的操作符混淆...... :( – fredoverflow 2010-05-31 10:15:29
看到[这个答案](http://stackoverflow.com/questions/2697892/what-is-return-type-of-new-in-c/2697929#2697929)到一个类似的问题。基本上,你需要明白有一个__new表达式___和一个__new操作符___,它们是相关的,但不相同。 _ new expression_首先调用_operator new_,然后调用_constructor_。 – sbi 2010-05-31 09:04:55