在计算函数返回值之前或之后是否销毁了局部变量
Are locals destroyed before or after evaluation of a function return value?
我正在考虑创建一个表示同步原语所有权的类,如下所示:
class CCriticalSectionLock
{
public:
CCriticalSectionLock( CCriticalSection &cs ) : cs( cs )
{ cs.Enter(); }
~CCriticalSectionLock()
{ cs.Leave(); }
private:
CCriticalSection &cs;
};
这看起来是一种好方法,能够在函数期间获得所有权并确保即使有多个退出点或异常,所有权也被释放。 但是,它确实提出了一些微妙的问题,即编译器何时会评估各种内容。 请考虑以下用法:
int MyMethod( void )
{
not_locked(); // do something not under lock
CCriticalSectionLock myLock( someCriticalSection );
locked(); // do something under lock
return ...; // some expression
}
AFAIK,C++生存期规则将保证在锁定之前调用not_locked()
,并且在持有锁定时调用locked()
。
但是,我不太清楚的是,返回的表达式何时会相对于调用锁析构函数的点进行计算。 是否保证在析构函数之前计算表达式? 我会这么认为,但我不是 100% 确定,如果不是,它可能会导致非常微妙、间歇性、难以发现的错误!
如果不是,那将是非常成问题的。
实际上,请考虑以下代码:
int function(){
MyClass myObject;
//stuff
return 5 + myObject.getNumericalValue();
}
与getNumericalValue()
一个简单的成员函数,该函数基于对成员变量的计算返回 int。如果在销毁 myObject
后计算表达式,您将具有未定义的行为,并且在 return 语句中使用局部变量是不可能的(事实并非如此(。
在您的情况下,锁将在评估 return 语句后被销毁。
为了增加一些严格性,让我引用标准(§3.7.3/3,强调我的(:
如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则不应 在其区块结束之前销毁,即使它看起来 未使用
对于函数,块的末尾在 return 语句之后。
相关文章:
- 是否可以影响 C++ 中回调函数的局部变量?
- 返回对局部变量的引用是否正常工作?
- 局部变量是否在C++中?
- C++在局部变量的内存上是否有上限
- 我们是否需要原子地递增线程局部变量
- C++11 是否保证 return 语句中的局部变量将被移动而不是复制?
- 编译器是否可以从全局变量中读取两次,而不是存储一个局部变量
- 使用函数模板中静态局部变量的地址作为类型标识符是否安全
- C 11-当我将局部变量作为参数传递到线程中时,它是否安全
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- C++ 11 - 移动非局部变量是否安全
- 局部变量是否可以与命名空间具有相同的名称
- 当变量是局部变量时,是否需要删除
- 之前声明所有局部变量是否有性能提升或其他原因
- 是否释放了局部变量的地址
- 我是否应该将 const 用于局部变量以获得更好的代码优化
- 当您将引用返回到局部变量时,它是否是一种未定义的行为
- 在计算函数返回值之前或之后是否销毁了局部变量
- 编译器是否优化了内联函数的局部变量
- 局部变量的初始化:这些方法在语义上是否不同