问题描述
在运行一个c/c++的程序时,报如下错误:ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new [] vs operator delete)。代码如下:
void DemoFunc(char *pBuf)
{
char* val2 = new char[256];
for (int i = 0; i < 254; i++)
{
val2[i] = pBuf[i+305];
}
val2[254] = 0; // 0-Termination
//do something...
//do something end.
delete val2;
// ...
}
解决办法
在C++中new 和 new [] 在释放的时候,需要使用一直的形式: delete 和 delete [].
也就是说:
- new创建的是普通对象,则使用delete进行释放;
- new创建的是数组对象,即new ClassName[N],在释放时,这需要使用delete [];
所以,修复以上问题,只需要将 delete val2; 修改为 **delete [] val2; **即可。
另外,添加环境变量ASAN_OPTIONS可以屏蔽cppcheck,也就不会报这个错误了
export ASAN_OPTIONS=alloc_dealloc_mismatch=0
但还是应该从内存泄漏着手去修改,不推荐设置环境变量屏蔽cppcheck。
评论区