在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() {}
答案 0 :(得分:2)
mat1
调用后,可以销毁 mat4
和CrtDumpMemoryLeaks()
,将变量的声明移动到自己的块。
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) {}
};
这会减少您使用的总内存,或许更重要的是,保持数据连续,而不是分别为每行分配数据。