理解 auto_ptr<T>
1、auto_ptr<T>解决什么问题?
在堆上获取的资源,客户可能会忘记delete,或者由于异常没有执行到delete,导致资源泄漏。在栈上分配的对象,有个特点,不论出现什么情况,超出作用域后,都将调用析构方法。根据这个特点,可以使用栈上的对象管理指针,析构的时候执行delete,确保一定释放资源。
2、auto_ptr就是解决这个问题的,auto_ptr就是个资源管理类,它的特点是拥有权转移。
3、考虑,如果让我来设计auto_ptr,我该怎么做?
auto_ptr是个资源管理类,对指针封装。有几点需要注意:
a、可以对不同类型的指针进行封装,因此需要一个模板类。
b、copy构造,copy赋值的时候,对拥有权转移。
c、考虑到,不同资源管理类之间的兼容,比如将auto_ptr<Dog>对象赋值给auto_ptr<Animal>,对于copy构造和copy赋值,需要添加对应的模版成员方法。
d、要让资源管理类,行为像一个指针,因此要重载操作符*,->,它们不改变对象内容,声明为const成员方法。
e、为了与其它接口兼容,资源管理类必须提供接口get(),暴露内部资源,get()不改变对象内容,声明为const成员方法。
f、最重要的,析构方法执行delete。
4、示例代码如下:
1 template<typename T> 2 class auto_ptr 3 { 4 public: 5 auto_ptr(T* ptr):_ptr(ptr) 6 { 7 } 8 9 auto_ptr(auto_ptr<T>& rhs) 10 { 11 _ptr = rhs._ptr; 12 rhs._ptr = 0; 13 } 14 15 auto_ptr& operator=(auto_ptr<T>& rhs) 16 { 17 if(this != &rhs) 18 { 19 this->_ptr = rhs._ptr; 20 rhs._ptr =0; 21 } 22 return *this; 23 } 24 25 26 template <typename U> 27 auto_ptr<T>(auto_ptr<U>& rhs) 28 { 29 _ptr = rhs._ptr; 30 rhs._ptr = 0; 31 } 32 33 template <typename U> 34 auto_ptr<T>& operator=(auto_ptr<U>& rhs) 35 { 36 if(this != &rhs) 37 { 38 this->_ptr = rhs._ptr; 39 rhs._ptr =0; 40 } 41 return *this; 42 } 43 44 T& operator*() const 45 { 46 return *_ptr; 47 } 48 49 T* operator->() const 50 { 51 return _ptr; 52 } 53 54 T* get() const 55 { 56 return _ptr; 57 } 58 59 ~auto_ptr() 60 { 61 delete _ptr; 62 } 63 64 private: 65 T* _ptr; 66 67 friend class auto_ptr; 68 };
5、特别注意:上面为什么加上 friend class auto_ptr?
在C++中,private成员只能在当前类中访问,只有两层含义:this指针可以访问private成员,同一类型的rhs可以访问private成员。如果rhs和this指针不是同一个类型,不能访问rhs 的private成员。在上面的模版成员方法中,rhs 是另一个类型,为了能访问它的private成员,需要说明auto_ptr之间都是friend,这样才能访问rhs 的private成员。
【推荐】国内首个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编程运行原理
2012-01-17 C# 值类型 与 引用类型
2012-01-17 .net 应用程序执行过程
2012-01-17 自包含 与 自描述