11

这会正常工作吗?(见示例)

unique_ptr<A> source()
{
    return unique_ptr<A>(new A);
}


void doSomething(A &a)  
{  
    // ...
}  

void test()  
{  
    doSomething(*source().get());   // unsafe?
    // When does the returned unique_ptr go out of scope?
}
4

3 回答 3

21

从函数返回的Aunique_ptr没有范围,因为范围仅适用于名称。

在您的示例中,临时的生命周期unique_ptr以分号结束。(所以是的,它会正常工作。)通常,当完全评估词法上包含其评估创建该临时对象的右值的完整表达式时,临时对象将被销毁。

于 2011-05-23T13:24:10.840 回答
5

临时值在评估“完整表达式”后被销毁,它(大致)是最大的封闭表达式 - 或者在这种情况下是整个语句。所以它是安全的;在 doSomething 返回后, unique_ptr 被销毁。

于 2011-05-23T13:26:35.413 回答
1

应该没问题。考虑

int Func()
{
  int ret = 5;

  return ret;
}

void doSomething(int a) { ... }


doSomething(Func());

即使您在堆栈上返回 ret 也没关系,因为它在调用范围内。

于 2011-05-23T13:27:19.280 回答