Где утечки памяти? - PullRequest
       10

Где утечки памяти?

1 голос
/ 14 мая 2011

У меня есть этот кусок кода, и по какой-то причине он вызывает 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 ]

4 голосов
/ 14 мая 2011

На данный момент:

this->x=this->nrOf;

nrOf не был инициализирован - у вас неопределенное поведение.

И, возможно, вы выиграете от использования std :: vector.

1 голос
/ 14 мая 2011

Попробуйте это как ваш только конструктор

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;
}
1 голос
/ 14 мая 2011

Вы не устанавливаете nrOf в число выделенных строк матрицы в любом из конструкторов.

1 голос
/ 14 мая 2011

Конструктор по умолчанию инициализирует nrOf с 0, но вы выделяете матрицу 10x10.Это означает, что деструктор не будет запускать цикл for, так как nrOf равен 0.

Кстати, вам не нужно префиксировать все с этим.Это делает код труднее для чтения.Вы должны использовать это только для устранения двусмысленности.

0 голосов
/ 15 мая 2011

Примечание 1:

Каждое новое выражение в вашем коде является возможной утечкой памяти, потому что ваш код ужасно исключителен: если любое из ваших выражений new выдает исключение для всех вашихутечка уже выделенного хранилища.

Примечание 2:

Ваш первый конструктор не семантически соответствует вашему деструктору (даже если мы предположим, что все идет нормально, не выбрасывая): конструктор присваивает нулевое значение this->nrOf, но выделяет 10 элементов массива this->matrix и назначает выделенный массив каждому элементу, но деструктор ожидает this->nrOf элементов this->matrix (массивов) для удаления, поэтому 0 элементов удаляется и, таким образом, 10 элементов

Примечание: Ваш this->x (существует согласно второму конструктору) не инициализируется первым конструктором.

Примечание 3:

Ваш второй конструктор просто поврежден: вы никогда не инициализируете переменную this->nrOf, а используете ее так, как будто она содержит что-то допустимое.

ADD:

Хороший совет здесь будет: никогда не используйте массивы и выражения 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;
    }
}
0 голосов
/ 14 мая 2011

Похоже, у вас есть переменная-член int x (используется в Lemon::Lemon(int n)), а также локальная переменная int x в Lemon::Lemon().Кроме того, вы не всегда устанавливаете nrOf в своих конструкторах.

...