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,然后调用构造函数。