Как удалить динамические c непрямые angular 2-мерные массивы в CPP - PullRequest
1 голос
/ 07 марта 2020

Это код, который я написал, чтобы понять работу с указателями. Здесь я хочу выделить и отобразить 2-мерный Pointerarray

int main()
{
    constexpr int size = 10;
    int** _2darray = new int* [size];

    for ( int i = 0; i < size; i++ )
    {
        *(_2darray + i) = new int[i];
        for ( int j = 0; j <= i; j++ )
        {
            *(*(_2darray + i) + j) = j;
        }
    }

    for ( int i = 0; i < size; i++ )
    {
        for ( int j = 0; j <= i; j++ )
        {
            std::cout << _2darray[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

. Это приведет к печати этого:

0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9

Но если я хочу предотвратить утечку памяти сейчас, я бы хочу сделать это:

for ( int i = 0; i < size; i++ )
  {
       delete[] _2darray[i];
  }
  delete[] _2darray;

К сожалению, это даст мне исключение, что куча была повреждена

enter image description here

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

Спасибо за любой короткий ответ.

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Ваш логин удаления c правильный.

Сообщение об ошибке означает, что ваша программа выполняет запись в память, выходящую за пределы. Однако сравнение j <= i не является неправильным - я имею в виду, что программа в настоящий момент генерирует желаемый результат.

Просто обратите внимание, что вы хотите, чтобы ваш i -й массив содержал i+1 предметов. Обратите особое внимание, что нулевой массив должен содержать один элемент (а именно, ноль), поэтому *(_2darray + i) = new int[i] должно быть *(_2darray + i) = new int[i+1].

При таком изменении в месте циклы for при сравнении j <= i верны. Индекс j будет перебирать каждый элемент в массиве i th, который содержит i+1 элементов. Сравнение j < i даст только i итераций, начиная с нуля, поэтому вам нужно j <= i в этом случае, даже если такое сравнение выглядит нестандартно. Рассмотрим j < i+1, что эквивалентно, но может быть более понятным.

0 голосов
/ 07 марта 2020
for ( int i = 0; i < size; i++ )
{
    *(_2darray + i) = new int[i];
     //...
}  

Для первой итерации, когда i=0 вы делаете:

*(_2darray + i) = new int[0];  

Это плохой способ выделения памяти. посмотрите это C ++ new int [0] - будет ли он выделять память?
А после того, как вы выполните:

for ( int j = 0; j <= i; j++ )

, оно должно быть:

for ( int j = 0; j < i; j++ )
...