模板中C ++中的内存泄漏

时间:2014-01-17 15:14:35

标签: c++ memory-leaks

在visual studio中_CrtDumpMemoryLeaks()检测到内存泄漏!但我无法找到它是如何发生的。请告诉我以下代码有什么问题。

// Declaration
template <class T> class cMatrix {
 private:
  std::vector<std::vector<T> > mat;
  unsigned rows;
  unsigned cols;

 public:
  cMatrix(unsigned _rows, unsigned _cols, const T& _initial);
  cMatrix(const cMatrix<T>& rhs);
  virtual ~cMatrix();
}


//Constructor 
template<class T>
cMatrix<T>::cMatrix(unsigned _rows, unsigned _cols, const T& _initial) {
  mat.resize(_rows);
  for (unsigned i=0; i<mat.size(); i++) {
    mat[i].resize(_cols, _initial);
  }
  rows = _rows;
  cols = _cols;
}

//VirtualDestructor
template<class T>
cMatrix<T>::~cMatrix() {}

3 个答案:

答案 0 :(得分:2)

mat1调用后,可以销毁

mat4CrtDumpMemoryLeaks(),将变量的声明移动到自己的块。

int main() 
{
  {
    cMatrix<double> mat1(2, 3, 23.0), mat4(2, 3, 15.0);
  }
  CrtDumpMemoryLeaks(); 
  return 0;
}

答案 1 :(得分:1)

问题是_CrtDumpMemoryLeaks();在与vector相同的范围内调用,因此调用它时对象不会被破坏。

这不会显示任何内存泄漏:

int main() 
{
{
cMatrix<double> mat1(2, 3, 23.0), mat4(2, 3, 15.0); 
}
_CrtDumpMemoryLeaks(); 
} 

顺便说一下,定义cMatrix的更有效方法是

// Declaration
template <class T> class cMatrix {
 private:
  std::vector<std::vector<T> > mat;
  unsigned rows;
  unsigned cols;

 public:
  cMatrix(unsigned _rows, unsigned _cols, const T& _initial);
  virtual ~cMatrix();
};


//Constructor 
template<class T>
cMatrix<T>::cMatrix(unsigned _rows, unsigned _cols, const T& _initial)
    : mat(_rows,std::vector<T>(_cols,_initial))
    , rows(_rows)
    , cols(_cols)
{
}

//VirtualDestructor
template<class T>
cMatrix<T>::~cMatrix() {}

答案 2 :(得分:0)

你已经得到了一些建议,给出了一个可能的方法来处理你所看到的问题。至少IMO,虽然有一些更好的方法。而不是将诊断代码与其他代码混合,然后添加大括号以引入与实际代码无关的范围,我将泄漏代码更完整地分开,将它放入一个单独的类中:

struct leak_dumper { 
    ~leak_dumper() { _CrtDumpMemoryLeaks(); }
} dump_leaks_at_exit;

这会创建对象的全局实例,因此您只需将这三行代码添加到包含main(或WinMain)的同一文件中,它就会泄漏 - 退出main后转储(没有对现有代码进行其他修改)。

就如何定义2D矩阵而言:如果矩阵的不同行可能包含不同数量的列,则向量矢量通常只有 。如果你想要一个矩形矩阵,你通常可以使用单个向量,并在重载运算符中将2D坐标转换为一个维度。

template <class T>
class matrix2D { 
     std::vector<T> data;
     int columns;
public:
     T &operator()(int x, int y) {
         return data[y * columns + x];
     }

     matrix2D(int x, int y) : data(x*y), columns(x) {}
};

这会减少您使用的总内存,或许更重要的是,保持数据连续,而不是分别为每行分配数据。