书中源代码运行时出错请大家看看

stackoffset 2009-12-12 02:53:42

#include <iostream>
using std::ostream; using std::cout; using std::endl;
#include <string>
#include <cstddef>
using std::size_t;

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;
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;
}

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);
ptr2.get_ptr_val();

cout << "(2) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;

ptr1.set_int(0);
ptr2.get_int();
ptr1.get_int();

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



在visual c++ 6.0中运行时会出错。在visual studio 2008中运行后程序后不能正常结束!
已经研究半宿了!!本人刚刚开始自学,没人指导,所以很菜。请大家帮助万分感谢!!
...全文
64 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2009-12-12
  • 打赏
  • 举报
回复
delete一个指针,前提是这个指针必须是通过new得到的,否则就很可能出错。
不考虑其它部分,只单独把class U_Ptr拿出来看,你会发现它的设计有问题:指针ip是从构造函数传进来的,从U_Ptr的角度无法保证它是由new得到的,所以就不应该由U_Ptr来delete。如果这个指针需要delete,那也是应该由把它new出来的那个函数或者类来负责。
brookmill 2009-12-12
  • 打赏
  • 举报
回复
delete ip 这里的ip是从main里&obj传过来的,delete一个指向局部变量的指针,所以出错了。

new/delete的要点是一定要成对使用,根据这个原则来看这段代码,就会发现delete比new多了。
还有一个原则是“谁分配谁释放”。class U_Ptr 里面的ip既然不是他自己new出来的,也就不应该由它来释放。

64,649

社区成员

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

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