c ++:何时销毁临时对象

c++: when is a temporary object destructed

有一些情况:
案例一:

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

这是一个临时对象。我们一到int i = 1;,它就会被销毁。我说的对吗?

案例 2:

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

我认为当我们到达时p会指向一个非法内存int i = 1;。但我总是可以 cout 正确的字符串。是我运气好还是 p 不违法?

案例 3:

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

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

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

when is a temporary object destructed

完整表达式完成后。

case 1:

string("test"); int i = 1; This is a temporary object. It will be destructed as soon as we arrive int i = 1;. Am I right?

case 2:

const char * p = string("test").c_str(); int i = 1; cout<< p; I think p will point an illegal memory when we arrive int i = 1;.

是的,会的

But I can always cout the right string. I'm just lucky or p is NOT illegal?

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

Can we throw a temporary object in a function and catch it at its higher-level function with a const reference?

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

在情况 1 和情况 2 中,一旦对临时对象所在的完整表达式求值,临时对象就会被销毁。在情况 1 中是语句结束的时间。

在情况 2 中,不,你不走运,它是未定义的行为似乎 正常工作只是其中之一UB 的可能性。

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