Кажется, я перестаю понимать как работает C++. Покопался в операторе new и не понял как он работает. А точнее - где в нём (или после него) вызывается конструктор объекта.
Итак, имеется простейший код:
Т.е. произошло выделение памяти, но не был вызван конструктор. Это логично, т.к. в реализации самого оператора он не вызывается, да и возвращает даже не указатель на объект, а (* void). Но тогда возникает вопрос: почему конструкция
работает по-другому? Это точно не препроцессирование, значит скорей всего такое поведение зашито где-то в компиляторе. Надо копать.
Итак, имеется простейший код:
#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;
работает по-другому? Это точно не препроцессирование, значит скорей всего такое поведение зашито где-то в компиляторе. Надо копать.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.