首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在计算函数返回值之前还是之后,局部变量是否已销毁?

在计算函数返回值之前还是之后,局部变量是否已销毁?
EN

Stack Overflow用户
提问于 2013-09-27 08:51:54
回答 1查看 2.3K关注 0票数 9

我正在考虑创建一个类,它表示同步原语的所有权,如下所示:

代码语言:javascript
复制
class CCriticalSectionLock
{
public:
    CCriticalSectionLock( CCriticalSection &cs ) : cs( cs )
    { cs.Enter(); }
    ~CCriticalSectionLock()
    { cs.Leave(); }
private:
    CCriticalSection &cs;
};

这看起来是一种很好的方法,可以在函数期间获得所有权,并确保即使存在多个出口点或异常,也可以释放所有权。然而,它确实提出了一些微妙的问题,即编译器将在什么时候对各种事情进行评估。考虑以下用途:

代码语言:javascript
复制
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()

但是,我不太清楚的是,返回的表达式将在何时根据调用锁析构函数的点进行计算。它是否保证表达式将在析构函数之前进行计算?我会这样认为,但我不是百分百肯定,如果不是,它可能会导致非常微妙,间歇性,难以找到的错误!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-27 08:59:30

如果不是的话,那将是个很大的问题。

实际上,请考虑以下代码:

代码语言:javascript
复制
int function(){

    MyClass myObject;
    //stuff
    return 5 + myObject.getNumericalValue();
}

使用getNumericalValue(),一个简单的成员函数,它根据成员变量的计算返回一个int。如果表达式是在myObject销毁后进行评估的,那么您就会有未定义的行为,并且在isn语句中使用局部变量是不可能的(事实并非如此)。

在您的情况下,锁将在评估返回语句后销毁。

为了增加一些严格性,让我引用标准(第3.7.3/3节,强调我的标准):

如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,则在其块结束之前不应销毁它,即使它似乎未使用,也不应作为优化而消除它。

对于函数来说,块的末尾是返回语句之后。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19046608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档