утечка памяти в двумерном массиве с указателями - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть функция, использующая двумерный массив, и я хочу скопировать данные из одного массива в другой, и я использовал массив tmp, но valgrind продолжал говорить, что у меня утечка памяти.Я не могу понять, почему.Следующее является частью функции.

   // valgrind gave me error as operator new[] (unsigned long) for the following line
   T** temp_pointer = new T*[rows];
   for (int i=0; i < rows; i++) {
            temp_pointer[i] = new T[columns];
   }

   for (int i =0; i< rows; i++) {
      for (int j =0; j < (columns-3); j++) {
             temp_pointer[i][j] = Arry[i][j];
    }
      temp_pointer[i][columns -3 ] = myvalue1;
      temp_pointer[i][columns-2] = myvalue2;
      temp_pointer[i][columns-1] = myvalue3;
   }
   for ( int i =0; i< rows; i++)
         delete [] Arry[i];

    delete [] Arry;
    Arry= temp_pointer;

У меня также есть деструктор, который рекурсивно удаляет указатели Arry.Арри является закрытым членом класса шаблона.

Я просто не мог понять, почему произошла утечка памяти.Я должен рекурсивно удалить temp_pointer ??(Я пытался, и это не сработало) Я просто не знал, где оно протекло?

1 Ответ

0 голосов
/ 09 февраля 2019

Не совсем понятно, почему valgrind утверждает, что память просачивается, но у вас явно есть доступ из вашего цикла вне границ.

temp_pointer[i][columns] = myvalue;

Индекс последнего элемента массива равенне size, а (size-1).Запись в расположение за пределами границ массива может привести к засорению служебной информации распределителя памяти и вызвать жалобу valgrind.

...