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

Отчет Cppcheck как ошибка «Несоответствие выделения и освобождения: cname» для строки с delete cname;, Я не вижу, в чем проблема с использованием моей версии кода — она ​​выглядит работающей.

Мой код неверен? Как мне это исправить? И каковы последствия использования моего кода?

if ( lenght != 0 )
{
char *cname = new char[lenght+1];
inbin.read(reinterpret_cast<char *>( cname ), lenght );
cname[lenght] = '\0';
*ptr_string = cname;
delete cname;
}

4

Решение

Да, когда вы выделяете массив с помощью new …[…] синтаксис, вы должны освободить его, используя delete[], В вашем случае вам нужно delete[] cname;,

Если вы используете неправильную форму delete чтобы соответствовать вашему распределению new, у вас есть неопределенное поведение:

§5.3.5 / 2 [expr.delete] В первой альтернативе (удалить объект), значение операнда delete может быть нулевым значением указателя, указателем на объект, не являющийся массивом, созданный предыдущим новое выражение, или указатель на подобъект, представляющий базовый класс такого объекта. Если нет, поведение не определено. Во втором варианте (удалить массив), значение операнда delete может быть нулевым значением указателя или значением указателя, полученным из предыдущего массива новое выражение. Если нет, поведение не определено.

8

Другие решения

if ( lenght != 0 )
{
char *cname = new char[lenght+1];
inbin.read(reinterpret_cast<char *>( cname ), lenght );
cname[lenght] = '\0';
*ptr_string = cname;
delete[] cname;
}
1