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++ 本身将确保在整个异常处理过程中都有一个有效的实例,并且异常处理程序可以引用该实际实例。
有一些情况:
案例一:
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++ 本身将确保在整个异常处理过程中都有一个有效的实例,并且异常处理程序可以引用该实际实例。