在堆栈上声明对象时,能否保证析构函数顺序?

Ala*_*lan 20 c++ destructor

我有基于范围控制互斥锁定/解锁的代码:

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

    doLoginCommand();

    ScopeLock < SharedMemoryBase > MemoryLock( &m_SharedMemory );

    doStoreLogin();

    ...
}
Run Code Online (Sandbox Code Playgroud)

我可以保证MemoryLock以前会被毁坏LoginLock吗?

CB *_*ley 38

是的.在任何特定范围内,本地对象以与构造它们相反的顺序被销毁.


小智 11

是的,析构函数按照与构造相反的顺序调用.


Jar*_*Par 11

再补充Neil的答案.

考虑相反的情况是否正确,即您无法预测堆栈声明变量的析构函数的顺序.这将使得几乎不可能在堆栈上使用依赖值类型.考虑

void Foo() {
  Type1 t1;
  Type2 t2(&t1);
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果C++不能保证析构函数的排序,那么像这样的直接代码将是非常不安全的,因为在t2的析构函数运行之前t1可能会被销毁.因此,您无法保证t2的析构函数以有效的t1值运行.