1

我面临着非常荒谬的问题,在 cpp 源中使用枚举。我只是分享问题所在的部分。

我在头文件中声明了一个枚举,如:< type.h >

 enum type{
    BT_PLAY,
    BT_DEACT
    };

接下来是文件<com.cpp>,用法如下:

#include <type.h>
...
void sendmsg(unsigned short requestId, char* json)
{
  ..
  void *data = Conv::doConvertReq(requestId, json, size);
  ...
  if(NULL != data){
    if(BT_PLAY == requestId){
      delete [](char*)data;
      data = NULL;

    } else{
        delete data;
        data = NULL;
    }

  }
}

接下来是文件<conv.cpp>,它的 API 在<com.cpp>中被调用。用法如下;

void*
Conv::doConvertReq(unsigned short requestId, const char* json, int& size){

  switch(requestId){
  ...
  case BT_PLAY:
  {
     char *val = new char[10];
     data = (void*) val;
     break;
  }
  case BT_DEACT:
  {
    struct *btDeact = new BT_T();
    data = (void*) btDeact;
    break;
  }
  ...
}

现在,当我使用KLOCWORK分析代码时,我看到泄漏报告为:

从“数据”中释放不匹配的内存。在第 70 行通过函数 'doConvertReq' 分配的 'data' 引用的内存通过将参数 1 传递给函数 'delete[]' 被非法释放

在通过 traceBlocks 进行跟踪时,它表示条件为:

  • 对于BT_DEACT案例,在文件conv.cpp中,取消分配是在com.cpp文件的sendmsg(...) API内的“BT_PLAY == requestId”案例中完成的。

似乎没有任何情况适合这种情况,但是 klocwork 报告了这一点。正如 valgrind 分析的那样,对于相同的代码设置,没有泄漏。任何线索,对于这种可能性?

4

0 回答 0