侧边栏壁纸
  • 累计撰写 74 篇文章
  • 累计创建 45 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

c++运行时报错误:there is a mismatch in alloc and dealloc

码峰
2022-09-05 / 0 评论 / 0 点赞 / 261 阅读 / 240 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

问题描述

在运行一个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。

0

评论区