安全指针使用的例子 (也有问题)

来源:互联网 发布:中国与欧盟贸易数据图 编辑:程序博客网 时间:2024/06/05 04:06
这是c++primer中的一个例子,但还会有问题出现
#include<iostream>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) {}HasPtr(const HasPtr &rhs): ptr(rhs.ptr), val(rhs.val){++ptr->use;}HasPtr& operator=(const HasPtr &rhs);~HasPtr(){if (--ptr->use == 0)delete ptr;}int const& get_use() const{return ptr->use;}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;return *this;}int main(){    int *p = new int(23);    HasPtr has1(p, 1);    HasPtr has2(has1);    std::cout << has2.get_use() << std::endl;    has2 = has1;    std::cout << has2.get_use() << std::endl;    return 0;}
下面这段代码就有出现问题:运行程序结束后会出现errorint main(){    int p = 23;//会出现error    HasPtr has1(&p, 1);    HasPtr has2(has1);    std::cout << has2.get_use() << std::endl;    has2 = has1;    std::cout << has2.get_use() << std::endl;    return 0;}
跟踪调试一下,原因是出现在析构函数里面
~U_Ptr() { if(NULL!=ip); delete ip; }

 


 

原创粉丝点击