C++ 我的删除[]有什么问题?
我总是使用C++ 我的删除[]有什么问题?,c++,fortify,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,
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
时可能调用的任何函数(假设它是宏),则就调用它们的代码所知,它们可能会抛出。如果他们这样做了,那么缓冲区就会泄漏。解决办法:坚持原则。RAII最简单的方法是使用std::vector
或std::string
SapUcConverter::format()是一个用于构建日志字符串的长函数。这是不可能的
仅仅因为没有
throw
表达式,并不意味着它不能抛出。听起来它可能会分配动态内存<代码>新建表达式可以抛出。追加到std::string
可能会引发错误。但是如果您100%认为SapUcConverter::format
中没有表达式可以抛出,那么您可以使用noexcept说明符。如果SapUcConverter::format
或在展开LOGMSG
时可能调用的任何函数(假设它是宏)没有声明,那么就调用它们的代码所知,他们可能会扔。如果他们这样做了,那么缓冲区就会泄漏。解决办法:坚持原则。RAII最简单的方法是使用std::vector
或std::string
SapUcConverter::format()是一个用于构建日志字符串的长函数。这是不可能的
仅仅因为没有
throw
表达式,并不意味着它不能抛出。听起来它可能会分配动态内存<代码>新建表达式可以抛出。追加到std::string
可能会引发错误。但是如果您100%认为SapUcConverter::format
中没有表达式可以抛出,那么您可以使用noexcept说明符。buflen是如何定义的?SapUcConverter::format(buffer,sapuc,len)在buffer
上做什么?注释if子句并检查内存泄漏。另外,请与vld联系。在到达delete[]
之前,您的代码能否抛出?在任何情况下,我都建议您使用某种包装器对象来处理内存释放。@下划线\u dvector
是个好主意。我不知道为什么我只使用POD。std::vector
比char[buflen]
好,但比std::string
差得多。buflen是如何定义的?SapUcConverter::format(buffer,sapuc,len)在buffer
上做什么?注释if子句并检查内存泄漏。另外,请与vld联系。在到达delete[]
之前,您的代码能否抛出?在任何情况下,我都建议您使用某种包装器对象来处理内存释放。@下划线\u dvector
是个好主意。我不知道为什么我只使用POD。std::vector
比char[buflen]
好,但还是比std::string
差得多。非常感谢用户207933。当然,我不能肯定没有例外。所以我有两个选择:a)忽略这个强化错误,b)使用RAII原理(vector或std::string)。@thersch,我甚至不知道你的问题是什么。当然,您需要使用std::string
。使用手动动态数组没有任何好处。@thersch,我的意思是std::string
。由于C++11中的小字符串优化和C++03中可能的CoW,它的性能可能比std::vector更高。。。SSO=Small String Optimization(),CoW=Copy-on-write()-再次学习。谢谢。@瑟奇:如果<代码> STD::UNIQUYGPTR <代码>不是旧的平台的选项,考虑相同的事情,并与C++ 98编译器一起工作。谢谢用户2079303。当然,我不能肯定没有例外。所以我有两个选择:a)忽略这个强化错误,b)使用RAII原理(vector或std::string)。@thersch,我甚至不知道你的问题是什么。当然,您需要使用std::string
。使用手动动态数组没有任何好处。@thersch,我的意思是std::string
。由于C++11中的小字符串优化和C++03中可能的CoW,它的性能可能比std::vector更高。。。SSO=Small String Optimization(),CoW=Copy-on-write()-再次学习。谢谢。@瑟奇:如果<代码> STD::UNIQUYGPTR <代码>不是一个选项,因为旧的平台,考虑相同的事情,并与C++ 98编译器一起工作。