【M13】以by reference 方式捕捉exceptions
1、catch语句的参数有三种方式:by pointer,by value,by reference。
2、首先考虑,by pointer。这意味着抛出端必须抛出一个对象的地址。那么问题来了:
如果这个对象分配在栈上,离开作用域,对象销毁,catch语句中指针指向一堆垃圾。
因此,这个对象不能分配在栈上,也就是说,离开了作用域对象仍然存在,没有销毁。那就只能是static对象,或者是heap对象。那么问题又来了,在catch语句的客户端,客户到底要不要执行delete呢?客户不知道这个对象是static还是heap对象。如果执行delete,而抛出端的对象是static,对不是在heap上分配的对象,执行delete,导致未定义行为。如果不执行delete,而抛出端的对象是heap对象,导致资源泄漏。因此,这种方式不可行。
另外,这与语言本身的惯例有矛盾。因为标准的异常bad_alloc,bad_cast,bad_typeid,bad_exception都是抛出对象,而不是对象指针。
因此,catch语句使用by pointer不可行。
3、考虑by value。我们知道从抛出异常到catch语句,之间必定有一个临时对象。如果catch语句是by value,导致临时对象再一次copy构造,而且,如果抛出子类对象,catch父类对象,将造成对象切割。在catch语句中,失去多态行为。
因此,catch语句使用by value,一是效率差,二是造成对象切割。不可行。
4、使用by reference很好地解决了上面的问题,只需要加上一个&。避开了对象是否删除的问题,减少了copy构造次数,避免了对象切割。因此,catch异常使用by reference。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理