找问题?c++程序
来源:百度知道 编辑:UC知道 时间:2024/06/08 13:13:42
using namespace std;
//------------------------------------------------------------------------------
class Vector
{
int size;
int* buffer;
public:
Vector(int s=100);
int& elem(int ndx);
void disp();
void set();
~Vector(){cout<<"Descontructing \n";}
};
//------------------------------------------------------------------------------
Vector::Vector(int s)
{
buffer=new int[size=s];
for(int i=0;i<size;i++)
buffer[i]=i*i;
cout<<"Constructing \n";
}
int& Vector::elem(int ndx)
{
if(ndx<0||ndx>size)
{cout<<"error in index \n";exit(1);}
return buffer[ndx];
}
inline void Vector::disp()
{
for(int i=0;i<size;i++)
cout<<buffer[i]<<endl;
}
inline void Vector::set()
{
for(int i=
楼主的程序可以编译运行。
确实,楼主的程序隐含存在一个问题--内存泄露。具体原因分析如下:
1、类Vector在类定义中存在一个整型指针成员buffer,这个指针成员在类的构造函数中被动态分配内存,但是,在该类的析构函数定义中未将指针内存释放,因此存在内存泄露。
2、如何解决内存泄露的问题呢?一个简单的方法是在类Vector的析构函数中添加指针内存释放指令,比如:
~Vector(){cout<<"Descontructing \n";if (buffer != (int *)NULL) delete buffer; }
但是,这样一来,程序反而运行失败。可以看到,程序中有这样的指令
Vector b(a); // 在对象b创建时,将对象a赋值给对象b
执行完这条指令以后,对象b拥有与对象a相同的数据成员,包括指针buffer,即b.buffer与a.buffer的指针值完全相同。当程序执行完最后一条指令退出时,对象a和b都自动调用析构函数,于是同一块内存(由a.buffer和b.buffer共同指向的动态内存)就被释放两次,程序运行失败。同时,也注意到,上述分析证明了程序演示的结果,即当执行上述指令之后,b.disp()还能够输出a.set()的结果。
3、如何解决动态内存两次释放的问题呢?应用到拷贝构造函数,比如如下定义:
Vector::Vector(Vector &obj)
{
if (obj.buffer != (int *)NULL)
{
size = obj.size;
buffer = new int[size];
memcpy(buffer, obj.buffer, sizeof(int)*size);
}
else
{
buffer = (int *)NULL;
}
}
这样的话,当执行指令
Vector b(a);
时,调用该类的拷贝构造函数来进行赋值。可以