
C++中在类的析构函数中释放指针成员的问题
为什么一下程序运行的时候会出错?没有语法错误,如果我将析构函数中的delete语句删除就不会出错,如果不调用友元函数也不会出错,而就算调用的友元函数内容为空,也会出错,所...
为什么一下程序运行的时候会出错?没有语法错误,如果我将析构函数中的delete语句删除就不会出错,如果不调用友元函数也不会出错,而就算调用的友元函数内容为空,也会出错,所以不知道到底错哪里,请高手指点 #include<iostream.h> class ca { int *p,n; public: ca(int m) { n=m; p=new int [n]; } void setv(int pos,int value) { p[pos]=value; } ~ca() { delete[]p; } int getca(int i) { return p[i]; } friend void f(ca ,int); }; void main() { ca a(4); f(a,4); for(int i=0;i<4;i++) cout<<a.getca(i); } void f(ca b,int n) { for(int i=0;i<n;i++) b.setv(i,i); }
展开
展开全部
szlon的解释没问题,但错误没有改全.
改成这样就可以了,改的地方加了★注释,楼主参考。
#include<iostream.h>
class
ca
{
int
*p,n;
public:
ca(int
m)
{
n=m;
p=new
int
[n];
}
void
setv(int
pos,int
value)
{
p[pos]=value;
}
~ca()
{
delete[]p;
}
int
getca(int
i)
{
return
p[i];
}
friend
void
f(ca&
,int);//★
};
void
main()
{
ca
a(4);
f(a,4);
for(int
i=0;i<4;i++)
cout<<a.getca(i);
}
void
f(ca
&b,int
n)//★
{
for(int
i=0;i<n;i++)
b.setv(i,i);
}
类的变量实例在每一次销毁的时候都会调用其析构函数,包括函数调用返回时候。
友元函数的参数传递的是类变量的值,实际上是生成了一个类的实例,函数执行完毕后返回,
这个实例就要销毁,销毁前调用其析构函数,析构函数调用的时候,释放了p申请的空间,其后
的操作
for(int
i=0;i<4;i++)
cout<<a.getca(i);
肯定是得到的释放后的空间的值(非法调用,且其值无法保证正确).
最后,程序结束前,又要销毁ca类的实例a,调用其析构函数,再次释放已经释放的空间,必然报错.
改成这样就可以了,改的地方加了★注释,楼主参考。
#include<iostream.h>
class
ca
{
int
*p,n;
public:
ca(int
m)
{
n=m;
p=new
int
[n];
}
void
setv(int
pos,int
value)
{
p[pos]=value;
}
~ca()
{
delete[]p;
}
int
getca(int
i)
{
return
p[i];
}
friend
void
f(ca&
,int);//★
};
void
main()
{
ca
a(4);
f(a,4);
for(int
i=0;i<4;i++)
cout<<a.getca(i);
}
void
f(ca
&b,int
n)//★
{
for(int
i=0;i<n;i++)
b.setv(i,i);
}
类的变量实例在每一次销毁的时候都会调用其析构函数,包括函数调用返回时候。
友元函数的参数传递的是类变量的值,实际上是生成了一个类的实例,函数执行完毕后返回,
这个实例就要销毁,销毁前调用其析构函数,析构函数调用的时候,释放了p申请的空间,其后
的操作
for(int
i=0;i<4;i++)
cout<<a.getca(i);
肯定是得到的释放后的空间的值(非法调用,且其值无法保证正确).
最后,程序结束前,又要销毁ca类的实例a,调用其析构函数,再次释放已经释放的空间,必然报错.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询