我有这段代码,由于某种原因,它会造成6次内存泄漏,我无法弄清楚在哪里。
Lemon::Lemon()
{
this->nrOf=0;
int x=10;
this->matrix=new int*[x];
this->lines=new string[x];
for (int i = 0; i < x; ++i)
this->matrix[i] = new int[x];
for(int i=0;i<x;++i)
for(int j=0;j<x;++j)
this->matrix[i][j]=-1;
}
Lemon::Lemon(int n)
{
this->x=this->nrOf;
this->matrix=new int*[x];
this->lines=new string[x];
for (int i = 0; i < x; ++i)
this->matrix[i] = new int[x];
for(int i=0;i<x;++i)
for(int j=0;j<x;++j)
this->matrix[i][j]=-1;
}
Lemon::~Lemon()
{
for(int i=0;i<this->nrOf;i++)
{
delete []this->matrix[i];
}
delete []this->matrix;
delete []this->lines;
}
感谢任何形式的帮助。
答案 0 :(得分:4)
此时:
this->x=this->nrOf;
nrOf尚未初始化 - 您有未定义的行为。
您可能会从使用std :: vector中受益。
答案 1 :(得分:1)
默认构造函数使用0初始化nrOf,但是您分配了10x10的矩阵。这意味着析构函数不会运行for循环,因为nrOf为0。
顺便说一句,你不必用这个为所有内容加前缀。它有点使代码更难阅读。你应该只使用它来消除歧义。答案 2 :(得分:1)
您没有将nrOf
设置为任一构造函数中已分配的矩阵行数。
答案 3 :(得分:1)
尝试将此作为仅构造函数
Lemon::Lemon(int n = 10) // default constructor
{
nrOf = n;
matrix = new int*[nrOf];
lines = new string[nrOf];
for (int i = 0; i < nrOf; ++i)
matrix[i] = new int[nrOf];
for(int i=0; i<nrOf; ++i)
for(int j=0; j<nrOf; ++j)
this->matrix[i][j] = -1;
}
答案 4 :(得分:0)
您似乎同时拥有成员变量int x
(在Lemon::Lemon(int n)
中使用)以及int x
中的局部变量Lemon::Lemon()
。此外,您不必在构造函数中始终设置nrOf
。
答案 5 :(得分:0)
注1:
代码中的每个新表达式都可能是内存泄漏,因为您的代码非常不安全:如果任何new
表达式抛出异常,则所有已经新分配的存储都会泄露。
注2:
你的第一个构造函数在语义上与你的析构函数不匹配(即使我们假设一切都没有抛出也没问题):构造函数为this->nrOf
分配零值但是分配了10个this->matrix
数组元素并分配了已分配的数组对于每个元素,但是析构函数需要删除this->nrOf
(数组)this->matrix
个元素,因此删除了0个元素,从而泄露了10个元素。
旁注:您的this->x
(根据第二个构造函数存在)未被第一个构造函数初始化。
注3:
你的第二个构造函数只是腐败:你永远不会初始化this->nrOf
变量,但你使用它就像包含有效的东西一样。
添加强>
这里的好建议是:永远不要使用数组和new
/ new[]
/ delete
/ delete[]
表达式。请在您的情况下使用std::vector
。这样你就不会关心内存泄漏,异常安全等等。
您的matrix
看起来像这样:
std::vector< std::vector<int> > matrix;
....................
....................
n = 10;
m = 20;
matrix.resize(n);
for( size_t j = 0; j < n; ++j )
{
matrix[j].resize(m);
for( size_t k = 0; k < m; ++k )
{
matrix[j][k] = j+k;
}
}