C ++ - 析构函数何时调用已使用但未分配的对象?

时间:2014-08-18 00:41:16

标签: c++ return-value destructor

示例:

std::unique_ptr<int> GetPtr() { return std::unique_ptr<int>(new int(5)); }
...
void DoSomething() {
  int x = 2 + *GetPtr();
}

在DoSomething中调用GetPtr()返回的unique_ptr的析构函数是什么时候?在调用&#39;运算符+&#39;之后调用它?或者,一旦我们离开&#39; DoSomething&#39;

的范围,它就会被调用

感谢。

2 个答案:

答案 0 :(得分:3)

我相信在调用operator +之前调用它,因为GetPtr()被调用,然后它的结果是取消引用,并被复制。对唯一指针的引用属于+运算符的参数范围。 operator*完成后,即在operator+被调用之前,对该值的最后一次引用将丢失。

答案 1 :(得分:3)

标准草案N3936 S12.2 / 3说:

  

临时对象作为最后一步被销毁   在评估全表达式(1.9)时(词法上)包含创建它们的点。

S1.9 / 10:

  

full-expression是一个表达式,它不是另一个表达式的子表达式。

S1.9 / 14:

  

每个值计算和与完整表达式相关的副作用在每个值计算和与要评估的下一个全表达式相关的副作用之前都会被排序。

注8:

  

8)正如在12.2中指定的那样,在评估完整表达式之后,临时对象的析构函数的零次或多次调用发生的顺序通常与每个临时对象的构造相反。

完整表达式是赋值的RHS,并且一旦计算完成就会出现序列点。 &#39; +&#39;计算之前和分配之前。