2009-08-07 1 views
18

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

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

    doLoginCommand(); 

    ScopeLock <SharedMemoryBase> MemoryLock(&m_SharedMemory); 

    doStoreLogin(); 

    ... 
} 

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

ответ

36

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

11

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

11

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

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

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

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

+0

Отличный ответ. У меня есть код, который опирается на порядок вызовов деструкторов, и я искал твердую причину, почему они всегда были упорядочены определенным образом, прежде чем доверять моему коду было правильным. – 2017-04-10 20:15:02

3

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

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

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

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

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

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

0

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