среда, 14 декабря 2011 г.

Вызвать new без конструктора

Кажется, я перестаю понимать как работает C++. Покопался в операторе new и не понял как он работает. А точнее - где в нём (или после него) вызывается конструктор объекта.


Итак, имеется простейший код:
#include <cstdio>

class A{
    public:
    A() {printf("a\n");}
    A(const A & a) {printf("a\n");}
    void print() {printf("hi\n");}
};

int main()
{
    A * a = 0;

    a = (A *) ::operator new(sizeof(A));
    printf("%d\n", a);
    a->print();
}
его исполнение выдаст следующий результат: 

13172752
hi

Т.е. произошло выделение памяти, но не был вызван конструктор. Это логично, т.к. в реализации самого оператора он не вызывается, да и возвращает даже не указатель на объект, а (* void). Но тогда возникает вопрос: почему конструкция

a = new A;

работает по-другому? Это точно не препроцессирование, значит скорей всего такое поведение зашито где-то в компиляторе. Надо копать.

Комментариев нет:

Отправить комментарий