关于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就会出现点,我把后面的都注释过结果发现没错,应该是初始化错误,但是我感觉没错,求教了 展开
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就会出现点,我把后面的都注释过结果发现没错,应该是初始化错误,但是我感觉没错,求教了 展开
2个回答
展开全部
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分配一个空间
~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
展开全部
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){}
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){}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询