Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我的删除[]有什么问题?_C++_Fortify - Fatal编程技术网

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 d
vector
是个好主意。我不知道为什么我只使用POD。
std::vector
char[buflen]
好,但比
std::string
差得多。buflen是如何定义的?SapUcConverter::format(buffer,sapuc,len)在
buffer
上做什么?注释if子句并检查内存泄漏。另外,请与vld联系。在到达
delete[]
之前,您的代码能否抛出?在任何情况下,我都建议您使用某种包装器对象来处理内存释放。@下划线\u d
vector
是个好主意。我不知道为什么我只使用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编译器一起工作。