2015-02-09 2 views
0

Я написал программу, которая заполняет 3-мерный массив таблицами многообразий произвольного размера (я знаю, что это не самый эффективный код, но я должен придерживаться указателей). Она компилирует, но при отладке вокруг удаления части она выбрасывает это:Ошибка 0xfeeefee2 при удалении 3-мерного массива

Unhandled exception at 0x0f8f59da (msvcr100d.dll) in 14chap-2.exe: 0xC0000005: Access violation reading location 0xfeeefee2. 

Я искал через Интернет по проблеме:

Но не мог найти подходящий ответ. Насколько я понимаю, проблема может заключаться в неправильном использовании нового оператора, но для меня это выглядит нормально.

Вот смысл часть кода:

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <string> 

using namespace std; 

int main() { 
    int size; 
    int size1; 
    int size2; 
    cin >> size; 
    cin >> size1; 
    cin >> size2; 
    size += 2; 
    size1 +=2; 
    size2 +=2; 
    int ***pp = new int ** [size]; 

    for (int i = 0; i < size; i++) { 
     pp [i] = new int* [size1]; 

     for (int j = 0; j < size1; j++) { 
      pp [i][j] = new int [size2]; 
     } 
    } 

    cout << '\n'; 

    for (int i = 0; i < size; i++) { 
     for (int j = 0; j < size1; j++) { 
      if (i == 0 || j == 0) { 
       pp[i][0][0] = i-1; 
       pp[0][j][0] = j-1; 
       cout << pp[i][j][0]; 
      } else { 
       pp [i][j][0] = pp[0][j][0]*pp[i][0][0]; 
       cout << pp[i][j][0]; 
      } 
     } 
     cout << '\n'; 
    } 

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

    delete [] pp; 

    cin.get(); 
    cin.ignore(); 
} 
+1

Поместите 'delete [] pp [i];' после внутреннего цикла for. –

+0

0xfeeefee2 сообщает мне, что вы, вероятно, разыскиваете указатель, который существует в кучной памяти, которая уже была освобождена: http://stackoverflow.com/a/127404/487892 – drescherjm

ответ

4

Вы должны сначала delete [] в pp[i][j] массивы, и только потом pp[i]. И pp последний.

Теперь вы первый удаление pp[i], а затем пытается получить доступ pp[i] удалить pp[i][j], что приведет к непредсказуемому поведению, поскольку pp[i] уже удалены в этой точке.

правило: Вызов delete [] в точном обратном порядке, чем вы делали new [].

Смежные вопросы