Я заметил это странное поведение / ошибку, когда вызывается метод класса до фактический объект инициализирован. У меня есть объект-обертка, который имеет 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*/}
};
Так есть ли что-то определенное в стандарте, которое может позволить такое поведение? Или, точнее, существуют ли неявные конструкции и т. Д., Которые могут обойти конструкцию по умолчанию?
Вероятно, вы используете wrapper_object
прежде чем он будет инициализирован. Переменные-члены создаются в том же порядке, в котором они объявлены в классе, поэтому убедитесь, что wrapper_object
объявлен ранее another_object
,
(Предполагается, что wrapper_object
а также another_object
являются переменными членов bad_behaviour
, но без более разумного примера кода трудно сказать.)
Ну, я сделал это трудным путем; Я переключил объекты из стека в кучу и инициализировал их явно через new
Ключевое слово, а не в списке инициализатора. Как я и думал, это не воспроизводило странное поведение, поэтому он работал как задумано. Теперь я думаю о том, что это может быть ошибка компилятора, поскольку способ, которым я это сделал через список инициализаторов, аналогичен тому, как я исправил проблему. Единственное, что изменилось, это то, что я раньше не выделял их в кучу.
Я также пытался предоставить рабочий код, который воспроизводит ошибку, но ошибка там не была показана. Это может быть потому, что реальный код, в котором была замечена ошибка, довольно сильно зависит от типов шаблонов и объектов-оболочек. Как это работает сейчас, когда объекты размещаются в куче, ошибка не в коде, а в компиляторе.