您的位置:首页 > 编程语言 > C语言/C++

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

2013-07-15 11:32 239 查看
这是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;
}
下面这段代码就有出现问题:运行程序结束后会出现error
int 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; }

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c