Подтвердить что ты не робот

Можете ли вы гарантировать порядок деструктора, когда объекты объявлены в стеке?

У меня есть код, который управляет блокировкой/разблокировкой мьютекса в зависимости от области действия:

void PerformLogin()
{
    ScopeLock < Lock > LoginLock( &m_LoginLock );

    doLoginCommand();

    ScopeLock < SharedMemoryBase > MemoryLock( &m_SharedMemory );

    doStoreLogin();

    ...
}

Могу ли я гарантировать, что MemoryLock будет разрушен до LoginLock?

4b9b3361

Ответ 1

Да, это так. В любой конкретной области локальные объекты уничтожаются в обратном порядке, чтобы они были построены.

Ответ 2

Добавляя к Нейлу ответ.

Рассмотрим, было ли противоположное истинно, то есть вы не могли предсказать порядок деструкторов для объявленных переменных стека. Это сделало бы почти невозможным использование зависимых типов значений в стеке. Рассмотрим

void Foo() {
  Type1 t1;
  Type2 t2(&t1);
  ...
}

Если С++ не гарантировал упорядочение деструктора, прямой код, подобный этому, был бы невероятно опасным, потому что было бы возможно, чтобы t1 был уничтожен до запуска t2 destructor. Следовательно, вы не можете гарантировать, что деструктор t2 работает с действительным значением t1.

Ответ 3

Да, деструкторы вызываются в обратном порядке построения.

Ответ 4

Вопрос уже был дан, но я хотел бы добавить, что у меня обычно есть привычка писать что-то вроде этого:

void PerformLogin()
{
    ScopeLock < Lock > LoginLock( &m_LoginLock );
    doLoginCommand();

    {
        ScopeLock < SharedMemoryBase > MemoryLock( &m_SharedMemory );
        doStoreLogin();
        ...
    }
}

По-моему, это делает цель более ясной (*). Это может иметь значение, если ваш код действительно полагается на определенный порядок. Я нахожу, что это делает менее вероятным, что кто-то случайно меняет порядок и вызывает труднодоступную ошибку. (Ну, это, конечно, не проблема, так как у всех нас есть тесты на месте, не так ли?)

Я всегда пишу лишние круглые скобки в чем-то вроде (a && b) || c тоже, и я считаю, что этот вопрос очень похож.

(*): Конечно, вы также можете использовать комментарий.

Ответ 5

Да, деструкторы являются обратными конструкторам. Поскольку деструкторы используются для удаления объектов, которые больше не требуются, а конструктор используется для создания объектов.