2015-03-31 3 views
0

У меня есть 2d массив указателей объектов, и я пытаюсь написать deallocator для объекта, который удаляет указатели в массиве, а затем удаляет сам массив. Я определяю массив в заголовке объекта уничтожаются как такНарушение прав доступа при удалении 2d-массива

space* board[6][6]; 

выделяют космические объекты в массиве таким образом:

board[0][0]= new space(1,0); 
    board[0][1] = new space(1, 0); 
    board[0][2] = new space(1, 0); 

Моего текущий деструктор, как это

for (int i = 0; i < 6; ++i) 
{ 
    for (int j = 0; j < 6; ++j){ 
     delete board[i][j]; 
    } 
    delete[] board[i]; 
} 
delete[] board; 

Когда я это сделаю, я получаю это сообщение: Необработанное исключение в 0x5080A9E8 (msvcr120d.dll) в Blitz.exe: 0xC0000005: место чтения нарушения доступа 0xFEEEFEE2.

Я не совсем уверен, что делать, я пробовал оглядеться, и, похоже, мой деструктор должен быть в порядке. Я знаю, если бы у меня было достойное образование в области программирования, я бы использовал что-то лучше, например, вектор или что-то еще. Я загрузил pdf-файл о том, как люди на самом деле используют C++ в наши дни, и я, вероятно, скоро перейду к этому, но я просто просто позабочусь об этой утечке памяти и продвигаюсь дальше.

+0

Вам действительно нужно использовать динамически выделенные объекты? – juanchopanza

ответ

0

Переменные board и board[i] не должны быть delete d, так как они не были выделены new.

+0

Спасибо, я знал, что просто забыл что-то немое. Массив платы фактически находится в стеке, да? Я так долго пробыл от C++, что забыл потрясающую сумму. – codechao

+0

Да, это в стеке. – haavee

0

Вы смешиваете new с delete[]. Поэтому поведение вашей программы undefined.

Было бы немного лучше, если бы вы использовали std::vector<std::vector<space>>. Тогда управление памятью будет сделано для вас.

Но если вы моделируете матрицу, то это также не очень хороший выбор: у него будет «зубчатый край», а выделенная память не будет смежной.

Хорошей альтернативой является выделение смежного блока и использование соглашения (i * rows + j) для элемента в (i, j). A std::vector<space> было бы достаточно. Затем рассмотрите возможность использования библиотеки сторонних матриц типа BLAS (www.boost.org).

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