C++中在类的析构函数中释放指针成员的问题
发布网友
发布时间:2023-06-22 18:02
我来回答
共1个回答
热心网友
时间:2024-11-15 23:50
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,调用其析构函数,再次释放已经释放的空间,必然报错.