读书人

关于智能指针。解决思路

发布时间: 2012-03-30 17:32:09 作者: rapoo

关于智能指针。

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的实现原理

读书人网 >C++

热点推荐