关于智能指针。
- C/C++ code
#include <iostream>#include <cstdlib>using namespace std;class HasPtr;class U_Ptr{ friend class HasPtr; int *ip; size_t use; U_Ptr(int *p):ip(p),use(1){} ~U_Ptr(){delete ip;}};class HasPtr{public: HasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i) { cout<<"构造"<<endl; } HasPtr(const HasPtr &orig):ptr(orig.ptr),val(orig.val) { ++ptr->use; cout<<"初始化"<<endl; } HasPtr &operator=(const HasPtr&); ~HasPtr() { if(--ptr->use==0) delete ptr; cout<<"析构"<<endl; } int geti(){return val;}private: U_Ptr *ptr; int val;};HasPtr& HasPtr::operator=(const HasPtr &rhs){ ++rhs.ptr->use; if(--ptr->use==0) delete ptr; ptr=rhs.ptr; val=rhs.val; cout<<"="<<endl; return *this;}int main(){ int i=0; int *p=&i; HasPtr a(p,2); HasPtr b(a); HasPtr c=a; cout<<a.geti()<<endl; return 0;}在vs2010下,输出: 构造 初始化 初始化 2 析构 析构
然后弹出 Debug Assertion Failed 的窗口。
在Dev C++ 下没说错误,但输出没有“析构”。
[解决办法]
int i=0;
int *p=&i;
不是new的
[解决办法]
参考:
动态分配资源的自动释放 - auto_ptr的实现原理