找问题?c++程序

来源:百度知道 编辑:UC知道 时间:2024/06/08 13:13:42
#include <iostream>
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);
  时,调用该类的拷贝构造函数来进行赋值。可以