c ++:何时被破坏的临时对象

时间:2015-09-15 08:29:56

标签: c++ temporary-objects

有些情况:
案例1:

string("test");
int i = 1;

这是一个临时对象。它会在我们到达int i = 1;后立即被破坏。我是对的吗?

案例2:

const char * p = string("test").c_str();
int i = 1;
cout<< p;

我认为当我们到达int i = 1;时,p会指出非法记忆。但我总是cout正确的字符串。我很幸运,或者p不是非法的?

案例3:

void fun()
{
    throw Exception("error");
}

int main()
{
    try
    {
        fun();
    }catch(const Exception & e)
    {
        cout << e.description();
    }
}

我们可以throw一个函数中的临时对象,并使用const引用在其更高级别的函数中捕获它吗?

2 个答案:

答案 0 :(得分:4)

在案例1和案例2中,一旦评估了它的完整表达式,就会破坏临时对象。在案例1中,当陈述结束时。

在案例2中,没有你不幸运,它的未定义的行为并且似乎正在工作只是其中之一UB的可能性。

对于案例3,C ++本身将确保整个异常处理都有一个有效的实例,异常处理程序可以引用该实际的实例。

答案 1 :(得分:0)

  
    

何时被破坏的临时对象

  

完整表达完成后。

  

案例1:

     

的字符串(&#34;测试&#34); int i = 1;这是一个临时对象。这将是   我们到达时i = 1;我是对的吗?

  

案例2:

     

const char * p = string(&#34; test&#34;)。c_str(); int i = 1; COUT&LT;&LT;磷;我认为   当我们到达i = 1时,p将指向非法存储器。

是的,它会

  

但我可以   总是cout正确的字符串。我很幸运,或者p不是非法的?

因为在std :: cout的情况下,完整表达式仅在分号后完成。

  

我们可以在函数中抛出一个临时对象,并使用const引用在其更高级别的函数中捕获它吗?

是的,你可以:This链接对异常对象生命周期有一个很好的解释。我认为异常表达式在捕获异常时结束(但这只是一种思考它的方式)。