C++ Primer中的智能指针看不明白请大家帮忙分析

stackoffset 2009-12-11 03:34:58

class U_Ptr
{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p):ip(p),use(1){};
~U_Ptr(){delete ip;}//这里的指针ip是通过new分配的内存地址吗?
};

class HasPtr
{
U_Ptr *ptr;
public:
HasPtr(int *p):ptr(new U_Ptr(p)){}
~HasPtr()
{
if(--ptr->use == 0)
delete ptr;
}
HasPtr(const HasPtr &otherHasPtr):ptr(otherHasPtr.ptr)
{
++ptr->use;
}
HasPtr &operator=(const HasPtr &otherHasPtr)
{
if(--ptr->use == 0)
delete ptr;
ptr = otherHasPtr.ptr;
++ptr->use;
return *this;
}

};

一个简单的问题:如上所示,U_Ptr类中的数据成员int *ip,并不是通过new分配的,为什么在析构的时候还能通过delete释放呢?先谢谢大家了!
...全文
160 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
stackoffset 2009-12-11
  • 打赏
  • 举报
回复
这是本问题的全部源代码

#include <iostream>
using std::ostream; using std::cout; using std::endl;
#include <string>
#include <stddef.h>

class U_Ptr {
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p): ip(p), use(1) { }
~U_Ptr() { delete ip;} //加上delete ip以后会出错
};

class HasPtr {
public:
HasPtr(int *p, int i): ptr(new U_Ptr(p)), val(i) { }
HasPtr(const HasPtr &orig):
ptr(orig.ptr), val(orig.val) { ++ptr->use; }
HasPtr& operator=(const HasPtr&);
~HasPtr() { if (--ptr->use == 0) delete ptr; }
friend ostream& operator<<(ostream&, const HasPtr&);
int *get_ptr() const { return ptr->ip; }
int get_int() const { return val; }
void set_ptr(int *p) { ptr->ip = p; }
void set_int(int i) { val = i; }
int get_ptr_val() const { return *ptr->ip; }
void set_ptr_val(int i) { *ptr->ip = i; }
private:
U_Ptr *ptr; // points to use-counted U_Ptr class
int val;
};

HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
++rhs.ptr->use; // increment use count on rhs first
if (--ptr->use == 0)
delete ptr; // if use count goes to 0 on this object, delete it
ptr = rhs.ptr; // copy the U_Ptr object
val = rhs.val; // copy the int member
return *this;
}

ostream& operator<<(ostream &os, const HasPtr &hp)
{
os << "*ptr: " << hp.get_ptr_val() << "\tval: " << hp.get_int() << endl;
return os;
}

int main()
{
int obj = 0;
HasPtr ptr1(&obj, 42);
HasPtr ptr2(ptr1);
cout << "(1) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;
ptr1.set_ptr_val(42); // sets object to which both ptr1 and ptr2 point
ptr2.get_ptr_val(); // returns 42
cout << "(2) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;
ptr1.set_int(0); // changes s member only in ptr1
ptr2.get_int(); // returns 42
ptr1.get_int(); // returns 0

cout << "(3) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;
}


先感谢大家的帮助!即然说那句delete ip没有错,为什么我在visual c++ 6.0中加上delete ip后会出错,如果不加的话就不会出错呢?
LJJComeOn 2009-12-11
  • 打赏
  • 举报
回复
都说的很好,我就不多说了,最近我在看Boost库,里边的有各种类型的智能指针
Dolphin_001 2009-12-11
  • 打赏
  • 举报
回复
跟踪下p的使用和传递。。。
cattycat 2009-12-11
  • 打赏
  • 举报
回复
那个ip的指针是通过构造函数传进来的,在外面new的,所以最终可以删除,没问题。
go_Michael 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
你认真看了怎么使用这个U_Ptr示例代码没有?
[/Quote]

正解
lucasma.eth 2009-12-11
  • 打赏
  • 举报
回复
同意3楼的说法, LZ只看了如何写一个设计智能指针,却忽略了如何用智能指针.
deng1243 2009-12-11
  • 打赏
  • 举报
回复
看构造函数;
U_Ptr(int *p):ip(p),use(1){}; 
HasPtr(int *p):ptr(new U_Ptr(p)){}

delete ip;就是delete p;
老邓 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
你认真看了怎么使用这个U_Ptr示例代码没有?
[/Quote]
看了很多你的回复!
授人渔而不是鱼,佩服!
老邓 2009-12-11
  • 打赏
  • 举报
回复
shared_ptr sp(new int);

比如上面的那个new,就是智能指针来delete掉的。
taodm 2009-12-11
  • 打赏
  • 举报
回复
你认真看了怎么使用这个U_Ptr示例代码没有?
老邓 2009-12-11
  • 打赏
  • 举报
回复
外部new,智能指针帮你delete

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧