2013-12-02 2 views
0

У меня возникли проблемы с пониманием того, почему мой метод удаления неверен.освобождение динамического массива строк 2d в C++

Для моего создания матрицы У меня есть:

43 matrix = new string*[row]; 
44 for(int i = 0; i < row; i++) { 
45  matrix[i] = new string[col]; 
46 } 
47 for(int i = 0; i < row; i++) { 
48  for(int j = 0; j < col; j++) { 
49   matrix[i][j] = array[i][j]; 
50   //cout << matrix[i][j] << ' '; 
51  } 
52  cout << endl; 
53 } 

Тогда в моем деструктора у меня есть:

15 for(int i = 0; i < row; i++) { 
16  delete matrix[i]; 
17 } 
18 delete matrix; 

Моя программа аварий на первой записи удаления

+3

Попробуйте 'удалить [] матрица [я] и' удалить [] matrix' – IdeaHat

+2

Примечание: ' delete [] 'what you' new [] 'и' delete', что вы 'new'. Тем не менее, я подозреваю, что ваш содержащий объект (из которого 'matrix' является членом) неправильно реализует« Правило трех ». Если у вас все еще есть эта проблема после исправления синтаксиса array-delete (и я думаю, что вы это сделаете), опубликуйте определение класса, которое содержит 'matrix'. – WhozCraig

+0

Используйте std :: vector. Нет никакой веской причины не делать этого. –

ответ

0

Как уже было сказано, вы должен пара new[] с delete[]. В этих строках:

matrix = new string*[row]; 
matrix[i] = new string[col]; 

Вы используете new[], поэтому в дальнейшем, вы должны сделать:

delete[] matrix[i]; 
delete[] matrix; 

Для справки см this link.

Когда вы выделили свой двумерный массив, вы создали N одномерные массивы. Теперь каждый из них должен быть удален, но система не знает, сколько из них есть. Размер массива верхнего уровня , т. Е. Массив указателей на ваши массивы второго уровня , аналогичен любому другому массиву в C: его размер не сохраняется в системе.

Вот что Valgrind должен сказать, если вы используете delete вместо delete []:

==30045== Mismatched free()/delete/delete [] 
==30045== at 0x4A05FD6: operator delete(void*) (vg_replace_malloc.c:480) 
==30045== by 0x400725: main 
==30045== Address 0x4c2e040 is 0 bytes inside a block of size 160 alloc'd 
==30045== at 0x4A07152: operator new[](unsigned long) (vg_replace_malloc.c:363) 
==30045== by 0x400715: main 
0
matrix = new string*[row]; 
for(int i = 0; i < row; i++) { 
    matrix[i] =delete[col]; 
} 
delete[] matrix; 
Смежные вопросы