Как оператор new вызывает конструктор класса? - PullRequest
5 голосов
/ 31 мая 2010

Я знаю, что новый оператор вызовет конструктор класса.

Но как это происходит, какие методы наземного уровня используются для этого.

Ответы [ 3 ]

6 голосов
/ 31 мая 2010

Вот как я это себе представляю:

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;
}

(*) Технически, на самом деле это не вызов нового размещения, но пока вы его не перегружаете, ментальная модель работает отлично:)

4 голосов
/ 31 мая 2010

Это не совсем новый оператор, который вызывает конструктор. Это больше компилятор, который переводит следующую строку:

MyClass * mine = new MyClass();

На следующее:

MyClass * mine = malloc(sizeof(MyClass));  // Allocates memory
mine->MyClass();                           // Calls constructor

С другим кодом обработки ошибок, который отмечали другие ответы.

1 голос
/ 31 мая 2010

Компилятор генерирует машинный код для этого. Когда компилятор видит

CSomeClass* object = new CSomeClass();

( новый оператор ) генерирует код, который вызывает соответствующий operator new() (который выделяет память), вызывает правильный конструктор, вызывает деструкторы всех полностью построенных подобъектов в случае исключения, вызывает operator delete() в случае возникновения исключения во время строительства. Все это делается с помощью дополнительного машинного кода, сгенерированного компилятором C ++ для этого просто выглядящего оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...