好了,这一次,这一次编译器向我展示了一个内存错误(泄漏):


  otest(18015,0xacae32c0)malloc:*对象0x194e734错误:
  释放对象的校验和不正确-对象可能已修改
  被释放后。
  *在malloc_error_break中设置一个断点进行调试


我正在使用带有ARC激活功能和STL的clang,这是一个C ++文件(.cpp)。

我发现的结果:如果我评论“删除”行,那么它运行就没有问题。这让我想知道谁在释放我分配的内存(cStr)。

顺便说一句。此代码采用查询字符串(arg = abc&arg2 = asdb)并返回带有这些值的映射。

static map<string, string> getDecodedQueryString( string qs ) {
            map<string, string> r;

            qs = qs+"&";

            char key[100], value[100],  * cStr, *ptr;
            cStr = new char[ qs.length() ];
            memcpy( cStr, qs.c_str(), url.length()-1);
            cStr[qs.length()]=0;

            ptr =  strtok(cStr, "&");
            while ( ptr != NULL && sscanf( ptr, "%[^=]=%[^&]", &key, &value ) == 2) {
                r[key]=value;
                ptr = strtok(NULL, "&");
            }
            delete [] cStr; //leaking?

            return r;
        }


谢谢

最佳答案

问题可能在以下几行:

    cStr = new char[ qs.length() ];
    memcpy( cStr, qs.c_str(), url.length()-1);
    cStr[qs.length()]=0;


即使没有memcpy()(如我在上面的注释中所述,由于url的长度,它也可能有其自身的问题),cStr[qs.length()] = 0会在缓冲区末尾写入一个字节。

如果您的编译器具有strdup()可用(这是非标准的,但大多数都可以),则可以将其替换为:

cStr = strdup(qs.c_str());
// ...
free(cStr);


这使您不必麻烦手动分配字节,复制字节,在正确的位置终止null等。

08-28 15:31