template <class T> class SmartPtr{ public: SmartPtr(T* p = 0): pointee(p) { } ~SmartPtr(){ delete pointee; } SmartPtr(SmartPtr<T> & rhs):pointee(rhs.pointee) { rhs.pointee=0;} SmartPtr<T> & operator=(const SmartPtr<T> & rhs) { if(this!=&rhs) { pointee=rhs.pointee; } return *this; } private: T* pointee; }; int main(){ SmartPtr<int> ptr1 = new int(0); SmartPtr<int> ptr2(ptr1); //发生了什么? SmartPtr<int> ptr3; ptr3=ptr2; //又发生了什么事情? return 0; } 代码详细解释
时间: 2024-04-03 09:33:46 浏览: 42
类成员访问操作符“->”的重载-c++课件之操作符重载
这段代码是一个简单的实现智能指针的示例,其中类模板 SmartPtr<T> 表示一个智能指针,它能够自动地管理一个指向类型为 T 的对象的指针,确保在不再需要该对象时能够自动释放其所占用的内存。
在 main 函数中,首先创建了一个指向 int 类型对象的智能指针 ptr1,该指针被初始化为指向值为 0 的 int 类型对象。然后又创建了一个指向 int 类型对象的智能指针 ptr2,它的初始化方式为将 ptr1 作为参数传递给构造函数。这个时候,由于 SmartPtr<T> 类的拷贝构造函数已经被实现,所以会发生资源所有权的转移,即 ptr2 接管了 ptr1 所指向的内存资源,而 ptr1 被置为 0。
接着,又创建了一个指向 int 类型对象的智能指针 ptr3,并将 ptr2 赋值给它。这个时候,由于 SmartPtr<T> 类的赋值运算符已经被实现,所以也会发生资源所有权的转移,即 ptr3 接管了 ptr2 所指向的内存资源,而 ptr2 被置为 0。
最后,程序结束,智能指针所占用的内存资源也会被自动释放,从而避免了内存泄漏的问题。
阅读全文