关于new和delete的问题求教

todayq 2011-04-20 02:52:11
#include<iostream>
using namespace std;
class U_Ptr{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int*p):ip(p),use(1) {}
~U_Ptr()
{
cout<<"delete U_Ptr"<<endl;
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;
cout<<ptr->use<<endl;
}

HasPtr&operator=(const HasPtr&);
~HasPtr()
{
if(--ptr->use==0)
{
delete ptr;
}
cout<<"delete ptr "<<ptr->use<<endl;
}

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 obj;
HasPtr p1(&obj,42);
std::cout<<"********************************"<<std::endl;
HasPtr p2(p1);
std::cout<<"********************************"<<std::endl;
HasPtr p3(p1);
std::cout<<"********************************"<<std::endl;
return 0;
}

这段代码在输出最后一行星号之后出错。
按以下两种方式修改后,程序都能正常运行
1.U_Ptr(int*p):ip(p),use(1) {}
改为U_Ptr(int*p):ip(new int(*p)),use(1) {}
2.~U_Ptr()
{
cout<<"delete U_Ptr"<<endl;
delete ip;
}
改为~U_Ptr()
{
cout<<"delete U_Ptr"<<endl;


}
这两种改法,是否意味着new和delete必须成对出现?
还有,第二种改法,ip指针在析构的时候是否会被删除?
求解!
谢谢!
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
todayq 2011-04-20
  • 打赏
  • 举报
回复
谢谢各位了。
没想到涉及到那么多问题。
学到比我预期中还多的东西了
再次感谢各位大侠!!!!!!!!!
赵4老师 2011-04-20
  • 打赏
  • 举报
回复

new和delete

fopen和fclose
那样用。
haoruixiang 2011-04-20
  • 打赏
  • 举报
回复
路过 每天回帖即可获得10分可用分
justrun2005 2011-04-20
  • 打赏
  • 举报
回复
嗯,所以楼主可以结贴了。咱只要专家分。嘿嘿。
wesleyluo 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 justrun2005 的回复:]
你这里错误的根本原因是你
int obj;
HasPtr p1(&obj,42);
这一步,obj是一个栈上的变量,不是堆分配的,所以压根不能被delete.
改成HasPtr p1((new int(42)),42);
这样就没错了。
[/Quote]

果然啊.
justrun2005 2011-04-20
  • 打赏
  • 举报
回复
你这里错误的根本原因是你
int obj;
HasPtr p1(&obj,42);
这一步,obj是一个栈上的变量,不是堆分配的,所以压根不能被delete.
改成HasPtr p1((new int(42)),42);
这样就没错了。
songfuwen 2011-04-20
  • 打赏
  • 举报
回复
ip如果是外部new出来的,就不要在你自己的析构里去释放。这样会造成其他使用该指针的地方出错。另外,尽量少用异步释放,除非必须这么做。
justrun2005 2011-04-20
  • 打赏
  • 举报
回复
1.new delete不一定必须成对出现。
但是你得保证一个new的对象只被delete一次。

2.ip会随着整个对象的死亡而消失。但是ip所指的对象不会因为U_Ptr死亡而消失。
一根烂笔头 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pathuang68 的回复:]
1. new和delete必须成对出现;
2. 会
[/Quote]
+1
bdmh 2011-04-20
  • 打赏
  • 举报
回复
如果用new就要匹配delete释放,如果用了new,而在使用过程中修改了指针的位置等,那么delete时就会报错,因为已经不是原始的new出来的指针了
pathuang68 2011-04-20
  • 打赏
  • 举报
回复
1. new和delete必须成对出现;
2. 会

64,282

社区成员

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

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