Объект не строится

Я заметил это странное поведение / ошибку, когда вызывается метод класса до фактический объект инициализирован. У меня есть объект-обертка, который имеет operator->() метод. Теперь, когда я передаю объект другому объекту в качестве параметра конструктора в конструкторе, используя operator->() метод, фактический объект-оболочка не создается, а просто запускает operator->() метод.

Поскольку фактический пример кода довольно сложный и зависит от многих других вещей, я просто покажу фрагмент кода C ++, который может не скомпилироваться должным образом:

template<typename T>
class wrapper_object_type
{
public:
wrapper_object_type() {/*does not run*/}
T* operator->() {/*does run*/}
};
class bad_behaviour
{
public:
bad_behaviour() : another_object(wrapper_object->t_object)
{/*crashes(0xccc access violation*/}
};

Так есть ли что-то определенное в стандарте, которое может позволить такое поведение? Или, точнее, существуют ли неявные конструкции и т. Д., Которые могут обойти конструкцию по умолчанию?

-2

Решение

Вероятно, вы используете wrapper_object прежде чем он будет инициализирован. Переменные-члены создаются в том же порядке, в котором они объявлены в классе, поэтому убедитесь, что wrapper_object объявлен ранее another_object,

(Предполагается, что wrapper_object а также another_object являются переменными членов bad_behaviour, но без более разумного примера кода трудно сказать.)

2

Другие решения

Ну, я сделал это трудным путем; Я переключил объекты из стека в кучу и инициализировал их явно через new Ключевое слово, а не в списке инициализатора. Как я и думал, это не воспроизводило странное поведение, поэтому он работал как задумано. Теперь я думаю о том, что это может быть ошибка компилятора, поскольку способ, которым я это сделал через список инициализаторов, аналогичен тому, как я исправил проблему. Единственное, что изменилось, это то, что я раньше не выделял их в кучу.

Я также пытался предоставить рабочий код, который воспроизводит ошибку, но ошибка там не была показана. Это может быть потому, что реальный код, в котором была замечена ошибка, довольно сильно зависит от типов шаблонов и объектов-оболочек. Как это работает сейчас, когда объекты размещаются в куче, ошибка не в коде, а в компиляторе.

0