雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

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

2024-08-14 57

问题描述

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

更新于:3个月前
赞一波!

文章评论

评论问答