在 C++ 中抛出 e 引用时本地 var 销毁
local var destroy when throw e for refer in c++?
代码示例一:
try {
exception e;
throw e;
} catch(exception& refer)
代码示例二:
exception& method()
{
exception e;
return e;
}
有些书提到代码示例一没问题,代码二是错误的,因为其中e
是一个局部变量,函数结束时会破坏,但我的问题是为什么示例代码一可以吗?e
不也是局部变量吗?
是的,在示例 1 中,e
是 try 块的本地,并在退出该范围时销毁。 但是当你抛出时,编译器会创建一个副本(或移动),谁的生存期延长到 catch 块的末尾,而引用refer
引用的正是这个副本。
为了弄清楚编译器在这种情况下做了什么,我总是喜欢拿出我的Noisy
类。
#include <iostream>
class Noisy
{
public:
Noisy()
{ std::cout << "Noisy default constructn"; }
Noisy(Noisy const&)
{ std::cout << "Noisy copyn"; }
Noisy(Noisy&&)
{ std::cout << "Noisy moven"; }
~Noisy()
{ std::cout << "Noisy destroyn"; }
Noisy& operator=(Noisy const&)
{ std::cout << "Noisy copy assignn"; return *this; }
Noisy& operator=(Noisy&&)
{ std::cout << "Noisy move assignn"; return *this; }
void swap(Noisy&)
{ std::cout << "Noisy swapn"; }
};
int main(int argc, char* argv[])
{
try
{
std::cout << "in try blockn";
Noisy n;
std::cout << "about to throw nn";
throw n;
std::cout << "end of try blockn";
}
catch (Noisy & n)
{
std::cout << "in catch blockn";
}
std::cout << "after catchn";
}
相关文章:
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 派生类销毁的最佳实践是什么
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 如何在不销毁对象的情况下返回对象列表
- C++:处理线程本地对象销毁
- 将通用对象传递给 Rust 并在使用后传递回 C++ 进行销毁
- C++对象的创建和销毁
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- c++ 何时/为什么由值构造/销毁捕获变量
- 销毁C++中动态分配的内存(数组对象)
- 正确初始化和销毁对象指针的C++数组?
- C++在一个映射中存储不同的指针类型(并处理销毁)
- ( var > x) 和 ( x < var)之间有什么区别吗?
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 在 C++ 中抛出 e 引用时本地 var 销毁