Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 局部变量是在函数返回值求值之前还是之后销毁的?_C++_Return_Destructor_Object Lifetime - Fatal编程技术网

C++ 局部变量是在函数返回值求值之前还是之后销毁的?

C++ 局部变量是在函数返回值求值之前还是之后销毁的?,c++,return,destructor,object-lifetime,C++,Return,Destructor,Object Lifetime,我正在考虑创建一个表示同步原语所有权的类,如下所示: class CCriticalSectionLock { public: CCriticalSectionLock( CCriticalSection &cs ) : cs( cs ) { cs.Enter(); } ~CCriticalSectionLock() { cs.Leave(); } private: CCriticalSection &cs; }; 这看起来是一个很好的方

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

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
}

AFIK,C++生存期规则将保证在锁被调用之前调用代码> NojLokKeD()/Cudio >,并且在锁被保存时调用<代码>锁定()/<代码> < /P>


但是,我不太清楚的是,返回的表达式将在何时相对于调用锁析构函数的点进行求值。是否保证在析构函数之前对表达式求值?我想是的,但我不是100%确定,如果不是,它可能会导致非常微妙的,间歇性的,难以找到的错误

如果他们不这样做,那将是一个很大的问题

确实,考虑下面的代码:

int function(){

    MyClass myObject;
    //stuff
    return 5 + myObject.getNumericalValue();
}
使用
getNumericalValue()
一个简单的成员函数,该函数基于对成员变量的计算返回一个int。如果表达式是在销毁
myObject
后计算的,则会有未定义的行为,并且在return语句中不可能使用局部变量(事实并非如此)

在您的情况下,在对return语句求值之后,锁将被销毁

为了增加一些严格性,让我引用该标准(§3.7.3/3,重点):

如果具有自动存储持续时间的变量具有初始化或具有副作用的析构函数,它不应 在其块结束之前被销毁,也不能作为优化消除,即使它看起来是 闲置


对于一个函数,块的结尾在return语句之后。

Duplicate:@nabulke所以我没有找到任何东西。。。我在寻找销毁/评估,但那是隐藏在展开/复制下的。能够在返回中使用本地文件是一个很好的观点;我也考虑过这一点,但我想知道如果返回没有引用本地数据,是否有任何优化可以对其重新排序。