有没有办法检查这个内存泄漏?

时间:2016-01-14 19:40:35

标签: c++ memory-leaks

我有一个非常基本的函数bool read_binary( string filename, double*& buf, int &N),它从二进制文件中读取数据。我称之为:

int N;
double* A = NULL;
read_binfile(inputfile, A, N);
delete[] A;

其中read_binfile

bool read_binfile( string fname, double*& buf, int &N ) { 
    ifstream finp(fname.c_str(), ifstream::binary);

    finp.seekg(0, finp.end);
    N = finp.tellg()/8;
    buf = new double[N];
    finp.seekg(0, finp.beg);
    printf("N = %i\n", N); 
    finp.read( reinterpret_cast<char*>(buf), sizeof(buf[0])*N);

    if( finp ) {
        return true;
    } else {
        return false;
    }
}

我发现如果我(天真地)仅 read_binfile循环那么这会导致内存泄漏,而如果我在循环中包含double* A = NULLdelete[] A ,那么这种泄漏就不会发生。有没有办法(read_binfile内部)检查此类错误,或者是否需要正确使用read_binfile delete[]必须遵循而不再被调用?

1 个答案:

答案 0 :(得分:2)

您可以std::vector<double>使用buf。这将自动化内存管理。然后,您也不需要传递N作为参数。您可以从vector获得缓冲区的大小。

bool read_binfile(std::string const& fname,
                  std::vector<double>& buf)
{
   std::ifstream finp(fname.c_str(), std::ifstream::binary);

   finp.seekg(0, finp.end);
   size_t N = finp.tellg()/sizeof(buf[0]);
   buf.resize(N);

   finp.seekg(0, finp.beg);
   finp.read(reinterpret_cast<char*>(buf.data()), sizeof(buf[0])*N);

   if( finp ) {
      return true;
   } else {
      return false;
   }
}

并将其用作:

std::vector<double> A;
read_binfile(inputfile, A);
size_t N = A.size(); // Only if needed.