关于c++编译的错误,是关于智能指针的

#include<iostream>usingnamespacestd;classU_Ptr{friendclassHasPtr;int*ip;size_tuse;U_P... #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(){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;
}
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 v){val=v;}
int gptr()const{return *ptr->ip;}
void gjc(int i){*ptr->ip=i;}
private:
U_Ptr *ptr;
int val;
};
HasPtr& HasPtr::operator=(const HasPtr& a)
{
++a.ptr->use;
if(--ptr->use==0)
delete ptr;
ptr=a.ptr;
val=a.val;
return *this;
}
int main()
{
cout<<"霍霍,演示:"<<endl;
int *a,p1,p2;
cout<<"输入2个数试试"<<endl;
cin>>p1>>p2;
a=&p1;
HasPtr s1(a,p2);
cout<<*s1.get_ptr()<<" "<<s1.get_int()<<endl;
return 0;
}
我输入1,2就会出现点,我把后面的都注释过结果发现没错,应该是初始化错误,但是我感觉没错,求教了
展开
 我来答
guifang0923
2013-11-02 · TA获得超过371个赞
知道小有建树答主
回答量:308
采纳率:100%
帮助的人:359万
展开全部
U_Ptr(int *p):ip(p),use(1){}
~U_Ptr(){delete ip;}

这里ip指向p,而
a=&p1;
HasPtr s1(a,p2);

所以最终ip=&p1,p1的定义为
int *a,p1,p2;

是一个非动态分配的变量,怎么可以去delete呢,当然出错了

至于怎么改,就是当use=0时,要修给ip分配一个空间
更多追问追答
追问
我在use=0的时候加一个ptr->ip=new int ;顺利编译
然后我尝试在 a=&p1;前面加一个a=new int; 不能顺利编译,求教,还有一个问题,对于非动态分配变量用delete,不是释放其指向吗?使其成为悬垂指针吗? 难道我记错了。求指导。=0=0=
追答
非动态分配变量由系统负责释放,不能用delete释放的。

U_Ptr(int *p):ip(p),use(1){}

在use=0的时候加一个ptr->ip=new int ;同时:ip(p)改为在大括号里:*ip = *p
百度网友64a3230
2013-11-02
知道答主
回答量:37
采纳率:100%
帮助的人:20.4万
展开全部
size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版
size_t use;

U_Ptr(int *p):ip(p),use(1){}

HasPtr(int *p,int i):ptr(new U_Ptr(p)),val(i){}

new U_Ptr(p)

U_Ptr(int *p,size_t use):ip(p),us(use){}
HasPtr(int *p,int i):ptr(new U_Ptr(p,1)),val(i){}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式