我面临着非常荒谬的问题,在 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 分析的那样,对于相同的代码设置,没有泄漏。任何线索,对于这种可能性?