代码示例一:
try {
exception e;
throw e;
} catch(exception& refer)
代码示例二:
exception& method()
{
exception e;
return e;
}
有些书上提到代码示例一是可以的,代码二是错误的,因为 e
是一个局部变量,函数结束时会销毁,但我的问题是为什么示例代码一好的? e
不也是局部变量吗?
最佳答案
是的,在示例 1 中,e
在 try block 中是本地的,并且在退出该范围时被销毁。但是当你抛出时,编译器会制作一个拷贝(或移动),谁的生命周期会延长到 catch block 的末尾,而引用 refer
所指的就是这个拷贝。
为了弄清楚编译器在这种情况下会做什么,我总是喜欢提取我的 Noisy
类。
#include <iostream>
class Noisy
{
public:
Noisy()
{ std::cout << "Noisy default construct\n"; }
Noisy(Noisy const&)
{ std::cout << "Noisy copy\n"; }
Noisy(Noisy&&)
{ std::cout << "Noisy move\n"; }
~Noisy()
{ std::cout << "Noisy destroy\n"; }
Noisy& operator=(Noisy const&)
{ std::cout << "Noisy copy assign\n"; return *this; }
Noisy& operator=(Noisy&&)
{ std::cout << "Noisy move assign\n"; return *this; }
void swap(Noisy&)
{ std::cout << "Noisy swap\n"; }
};
int main(int argc, char* argv[])
{
try
{
std::cout << "in try block\n";
Noisy n;
std::cout << "about to throw n\n";
throw n;
std::cout << "end of try block\n";
}
catch (Noisy & n)
{
std::cout << "in catch block\n";
}
std::cout << "after catch\n";
}
关于c++ - 在 C++ 中 throw e for refer 时局部 var destroy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19393492/