关于new和delete的问题求教

todayq todayq 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#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指针在析构的时候是否会被删除?
求解!
谢谢!
...全文
评论 13
收藏 已收藏
分享
返回顶部
todayq
C++ 语言 65,214 成员 250,514 内容