У меня следующая ситуация:
У меня есть класс A, который содержит объект члена стека из класса B:
Class A{
B b;
}
Я использую объект B, чтобы переопределить поведение инициализации и уничтожения A.
Class B{
B(){cout<<"taken care of some specific context initialization"<<endl;}
~B(){cout<<"cleaning the context initialization done before"<<endl;}
}
Пока это работает, потому что ~ B () вызывается, когда b уничтожается (я думаю, это делается после деструктора A).
Это поведение, которое я ищу, но меня пугает возможность того, что компилятор скажет: «Эй, вы не используете объект, я собираюсь вернуть память раньше». Я думаю, это должно произойти, но возможно ли это в любом компиляторе? Я имею в виду, установлено ли на стандарте, что вы должны ждать уничтожения А?
заранее спасибо
C ++ следует поведению «как будто», то есть теоретически возможно для b
быть уничтоженным раньше до тех пор, пока на поведение программы это не влияет. И если это не затронуто, это действительно не имеет значения, когда это разрушено.
На практике, однако, b
будет уничтожен сразу после деструктора его владельца A
экземпляр будет уничтожен.
Это гарантируется:
8) После выполнения тела деструктора и уничтожая любые
автоматические объекты, размещенные в теле, деструктор для класса X
вызывает деструкторы для прямых не вариантных нестатических данных X
члены, деструкторы для прямых базовых классов X и, если Х является
тип самого производного класса (12.6.2), его деструктор вызывает
деструкторы для виртуальных базовых классов X. […] (выделение мое)
Обратите внимание, что реализация, чье наблюдаемое поведение действует так, как будто это происходит, все еще соответствует стандарту. В вашем конкретном случае, поскольку деструктор выполняет операции ввода-вывода, гарантируется, что такое поведение действительно имеет место.
Других решений пока нет …