我删除[]有什么问题?

时间:2016-02-16 13:45:30

标签: c++ fortify

我总是用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 个答案:

答案 0 :(得分:8)

如果SapUcConverter::format或在展开LOGMSG时可能被调用的任何函数(假设它是一个宏)未声明noexcept,那么就调用的代码而言他们知道,他们可能会扔。如果他们这样做,那么buffer泄漏。解决方案:坚持RAII原则。最简单的RAII方法是使用std::vectorstd::string

  

SapUcConverter :: format()是一个用于构建日志字符串的长函数。它没有投掷。

仅仅因为没有throw表达,并不意味着它不能抛出。听起来它可能会分配动态内存。 new表达式可以抛出。附加到std::string可能会抛出。但如果您100%表示SapUcConverter::format中没有表达式可以抛出,那么您可以使用noexcept说明符。