Ответ 1
Да, это так. В любой конкретной области локальные объекты уничтожаются в обратном порядке, чтобы они были построены.
У меня есть код, который управляет блокировкой/разблокировкой мьютекса в зависимости от области действия:
void PerformLogin()
{
ScopeLock < Lock > LoginLock( &m_LoginLock );
doLoginCommand();
ScopeLock < SharedMemoryBase > MemoryLock( &m_SharedMemory );
doStoreLogin();
...
}
Могу ли я гарантировать, что MemoryLock
будет разрушен до LoginLock
?
Да, это так. В любой конкретной области локальные объекты уничтожаются в обратном порядке, чтобы они были построены.
Добавляя к Нейлу ответ.
Рассмотрим, было ли противоположное истинно, то есть вы не могли предсказать порядок деструкторов для объявленных переменных стека. Это сделало бы почти невозможным использование зависимых типов значений в стеке. Рассмотрим
void Foo() {
Type1 t1;
Type2 t2(&t1);
...
}
Если С++ не гарантировал упорядочение деструктора, прямой код, подобный этому, был бы невероятно опасным, потому что было бы возможно, чтобы t1 был уничтожен до запуска t2 destructor. Следовательно, вы не можете гарантировать, что деструктор t2 работает с действительным значением t1.
Да, деструкторы вызываются в обратном порядке построения.
Вопрос уже был дан, но я хотел бы добавить, что у меня обычно есть привычка писать что-то вроде этого:
void PerformLogin()
{
ScopeLock < Lock > LoginLock( &m_LoginLock );
doLoginCommand();
{
ScopeLock < SharedMemoryBase > MemoryLock( &m_SharedMemory );
doStoreLogin();
...
}
}
По-моему, это делает цель более ясной (*). Это может иметь значение, если ваш код действительно полагается на определенный порядок. Я нахожу, что это делает менее вероятным, что кто-то случайно меняет порядок и вызывает труднодоступную ошибку. (Ну, это, конечно, не проблема, так как у всех нас есть тесты на месте, не так ли?)
Я всегда пишу лишние круглые скобки в чем-то вроде (a && b) || c
тоже, и я считаю, что этот вопрос очень похож.
(*): Конечно, вы также можете использовать комментарий.
Да, деструкторы являются обратными конструкторам. Поскольку деструкторы используются для удаления объектов, которые больше не требуются, а конструктор используется для создания объектов.