Гарантируется, что члены класса располагаются в то время, когда класс утилизируется

У меня следующая ситуация:

У меня есть класс 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).

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

заранее спасибо

3

Решение

C ++ следует поведению «как будто», то есть теоретически возможно для b быть уничтоженным раньше до тех пор, пока на поведение программы это не влияет. И если это не затронуто, это действительно не имеет значения, когда это разрушено.

На практике, однако, b будет уничтожен сразу после деструктора его владельца A экземпляр будет уничтожен.

Это гарантируется:

12.4 Деструкторы [class.dtor]

8) После выполнения тела деструктора и уничтожая любые
автоматические объекты, размещенные в теле, деструктор для класса X
вызывает деструкторы для прямых не вариантных нестатических данных X
члены, деструкторы для прямых базовых классов X
и, если Х является
тип самого производного класса (12.6.2), его деструктор вызывает
деструкторы для виртуальных базовых классов X. […] (выделение мое)

Обратите внимание, что реализация, чье наблюдаемое поведение действует так, как будто это происходит, все еще соответствует стандарту. В вашем конкретном случае, поскольку деструктор выполняет операции ввода-вывода, гарантируется, что такое поведение действительно имеет место.

2

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

Других решений пока нет …