内存泄漏在哪里

Where are the memory leaks?

本文关键字:在哪里 泄漏 内存      更新时间:2023-10-16

我有这段代码,由于某种原因,它产生了 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;
}
感谢

任何形式的帮助。

此时:

this->x=this->nrOf;

nrOf 尚未初始化 - 您有未定义的行为。

也许你会从使用std::vector中受益。

默认构造函数使用 0 初始化 nrOf,但您分配的矩阵为 10x10。这意味着析构函数不会运行 for 循环,因为 nrOf 为 0。

顺便说一句,您不必用这个前缀来前缀所有内容。它有点使代码更难阅读。您应该仅将其用于消除歧义。

您不会nrOf设置为任一构造函数中分配的矩阵行数。

尝试将其作为您唯一的构造函数

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

您似乎既有一个成员变量int x(在Lemon::Lemon(int n)中使用),又有一个局部变量int x Lemon::Lemon()。 此外,您不会在构造函数中始终如一地设置nrOf

注1:

代码

中的每个新表达式都可能是内存泄漏,因为您的代码非常异常不安全:如果任何new表达式抛出异常,则所有已新分配的存储都会泄漏。

注2:

您的第一个构造函数在语义上与您的析构函数不匹配(即使我们假设在不抛出的情况下一切正常):构造函数为this->nrOf分配零值,但分配this->matrix数组的 10 个元素并将分配的数组分配给每个元素 BUT 析构函数期望删除this->matrix(数组)的this->nrOf元素,因此删除 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;
    }
}