随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

【13】以对象管理资源

1、为什么要以对象管理资源,它解决什么问题?

  考虑下面的需求,客户需要一个动态分配的资源。我提供一个工厂方法,返回一个指针,指向资源。那么问题来了,谁来释放资源呢?只有客户知道什么时候不再使用资源,因此,应该是客户负责释放资源。如果客户没有成功释放资源,造成资源泄漏,注意,这里泄漏的资源不光是一块内存,还可能包括这块内存保存的其他资源。把成功释放资源的希望,寄托在客户身上,显然是不靠谱的。因为:a、客户可能忘记delete;b、代码异常,导致没有执行到delete。

2、它是如何解决这个问题的?

  我们知道,栈上分配的对象有个特点,超出作用域,不管什么情况,都会自动调用析构方法。因此,可以把堆上获取的资源,放入栈上的对象中,栈上对象的析构方法,进行delete操作,释放资源。相当于对获取的指针,进行封装。

3、以对象管理资源有两个关键想法:

  a、获取资源后,立刻放入栈上的管理对象内,也就是RAII(Resource Acquisition Is Initialization);

  b、栈上的管理对象超出作用域,无论出现什么情况,必定调用析构方法,释放资源。

4、这个管理对象类似指针,叫做智能指针。有两个典型的智能指针:auto_ptr和shared_ptr。auto_ptr会导致拥有权的转移,shared_ptr可以共享一个资源。

5、需要注意:auto_ptr和shared_ptr,在析构方法中,执行的是delete,而不是delete[]。这意味着,千万不要使用auto_ptr和shared_ptr管理动态分配的数组。

6、再仔细考虑下开头提出的需求,返回一个资源,期望客户进行封装,那还不如我自己封装好,返回给客户呢。我返回一个管理对象,用它初始化客户端的一个管理对象,注意:客户端的管理对象,只是一个副本。但是,他们中的指针都指向同一块内存。而且,管理对象之间的copy构造成本很低,就是保存同一个指针值,指向同一块内存。

posted on   Andy Niu  阅读(238)  评论(0编辑  收藏  举报
编辑推荐:
· 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编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示