gpt4 book ai didi

c++ - 我的 delete[] 有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:57 25 4
gpt4 key购买 nike

我总是使用 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::vectorstd::string

SapUcConverter::format() is a long function for building a logging string. There is no throw in it.

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

关于c++ - 我的 delete[] 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com