Я удаляю массивы всегда с 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;
Если SapUcConverter::format
или любая функция, которая может быть вызвана, когда LOGMSG
раскрывается (при условии, что это макрос) не объявляется noexcept
, тогда, насколько известно коду, который их вызывает, они могут выбросить. И если они это сделают, то buffer
Утечки. Решение: придерживаться RAII принцип. Простейшим способом RAII является использование std::vector
или же std::string
,
SapUcConverter :: format () — это длинная функция для построения строки журнала. Там нет броска в этом.
Просто потому, что нет throw
выражение не означает, что оно не может бросить. Похоже, это может выделить динамическую память. new
выражения можно скинуть. Добавление к std::string
может бросить. Но если вы на 100%, что нет выражения в SapUcConverter::format
можете бросить, тогда вы можете использовать спецификатор noexcept.
Других решений пока нет …