Что не так с моим delete []?

Я удаляю массивы всегда с delete[], Но HP Fortify показывает Утечка памяти для этого. Что не так с моим кодом?

unsigned buflen = SapUcConverter::getFormatBufferLength(len);

char* buffer = new char[buflen]; // Here is the memory leak marked by Fortify

if(valueCanBeLogged) {
LOGMSG(_DBUG, "nameForLog=%s, len=%d, sapuc='%.*s'",
nameForLog, len, buflen,
SapUcConverter::format(buffer, sapuc, len));
} else {
LOGMSG(_DBUG, "nameForLog=%s, len=#####, sapuc=#####");
}

delete[] buffer;

1

Решение

Если SapUcConverter::format или любая функция, которая может быть вызвана, когда LOGMSG раскрывается (при условии, что это макрос) не объявляется noexcept, тогда, насколько известно коду, который их вызывает, они могут выбросить. И если они это сделают, то buffer Утечки. Решение: придерживаться RAII принцип. Простейшим способом RAII является использование std::vector или же std::string,

SapUcConverter :: format () — это длинная функция для построения строки журнала. Там нет броска в этом.

Просто потому, что нет throw выражение не означает, что оно не может бросить. Похоже, это может выделить динамическую память. new выражения можно скинуть. Добавление к std::string может бросить. Но если вы на 100%, что нет выражения в SapUcConverter::format можете бросить, тогда вы можете использовать спецификатор noexcept.

8

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

Других решений пока нет …

По вопросам рекламы [email protected]