0

Так Valgrind дает мне эту ошибку:Valgrind: утечки памяти (mistmatched бесплатно()/удалить/удалить [])

Mismatched free()/delete/delete [] 

Который со ссылкой на следующую строку кода:

delete[] data[position+num]; 

но ошибка продолжает появляться даже после я изменить его на

delete data[position+num]; 

массив данных был выделен следующим образом:

data = new char*[width]; 
    for (int i=0; i<width; ++i){ 
      data[i] = new char; 
    } 

Я просто хочу удалить этот столбец из данных (char **).

Кроме того, ниже этой ошибки я получаю следующее:

Адрес 0x5a1c160 составляет 0 байт внутри блока размером 1 alloc'd

==21417== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
+0

Это не был «массив данных», который был выделен - это был массив указателей. Данные [0] - указатель на символ, данные [1] - указатель на символ и т. Д. С удалением [] data [position + num] вы говорите: «Удалите массив того же типа, что и данные [position + num], он находится в данных [position + num]», поэтому вы говорите «удалите массив указателей на char ", но на самом деле вы храните один указатель на char. Afaik - это неопределенное поведение в std, но компиляторы все равно получат от него. К сожалению, я не знаю, почему вы получаете сообщение об ошибке с данными delete [position + num], это похоже на действительное заявление для меня. – piezol

+0

Я никогда не использовал valgrind, если честно. Кроме того, это 2015 год, вы получите много ответов типа «никогда не используйте новый/удалить»;) – piezol

ответ

4

Не уверен, что вы имеете в виду delete[] data[position+num];. Ваш код также выглядит несколько сомнительным: data - это массив указателей на символ, т. Е. Массив C-подобных строк, но в цикле вы выделяете каждому указателю один char через data[i] = new char;. Вы уверены, что это то, что вы хотите? Обычно вы выделяете связку, data[i] = new char[some_length];.

В любом случае, вам нужно delete в обратном порядке распределения:

for (int i=0; i<width; ++i){ 
     delete data[i]; // or delete[] data[i] if pointing to more than one char 
} 
delete[] data; 

Или, лучше, не используйте new и delete вообще, и использовать стандартные контейнеры, как std::vector<std::string>. Если вы выделите более одного char, используйте вместо этого delete[].

+0

Что делать, если вы просто хотели удалить одну строку в 2D-массив? – user2804865

+0

Какая строка? один 'data [i]' указывает на какой-то определенный 'i'? – vsoftco

+0

Да, только эта строка – user2804865

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