我总是用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;
答案 0 :(得分:8)
如果SapUcConverter::format
或在展开LOGMSG
时可能被调用的任何函数(假设它是一个宏)未声明noexcept
,那么就调用的代码而言他们知道,他们可能会扔。如果他们这样做,那么buffer
泄漏。解决方案:坚持RAII原则。最简单的RAII方法是使用std::vector
或std::string
。
SapUcConverter :: format()是一个用于构建日志字符串的长函数。它没有投掷。
仅仅因为没有throw
表达,并不意味着它不能抛出。听起来它可能会分配动态内存。 new
表达式可以抛出。附加到std::string
可能会抛出。但如果您100%表示SapUcConverter::format
中没有表达式可以抛出,那么您可以使用noexcept说明符。