内存泄漏在哪里?

时间:2011-05-14 18:34:47

标签: c++ memory-leaks multidimensional-array

我有这段代码,由于某种原因,它会造成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;
}

感谢任何形式的帮助。

6 个答案:

答案 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;
    }
}