安全指针使用的例子 (也有问题)
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语言指针安全及指针使用问题
- 问题:指针为什么使用前要进行初始化及相关例子
- C++ map中key使用指针的问题
- 对空指针使用delete是安全的
- 外电头条:使用虚拟化最常见的安全问题
- 使用ladp null文章连接的安全问题
- Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
- 关于二级指针的使用测试小例子,仅供测试--参数传递的时候用指针最好,因为压栈的时候指针,只是压入一个地址的值,最多4个字节(32位机上),提供的3个测试例子,基于VC6.0的环境。
- ASP.NET 4.0中使用FCKeditor遇到安全问题警告的解决办法
- 实例解析使用指针作为函数参数传递需要注意的问题
- 一定要注意使用代理服务器的安全问题
- 使用计数器的智能指针模板例子
- <转>java编译问题:使用了未经检查或不安全的操作
- Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
- const和指针结合使用的例子
- 关于安全的ActiveX控件的编写,纠正大家一点错误,包括MSDN上也有问题
- Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
- rsync服务的安装、配置、使用及其安全问题