好了,这一次,这一次编译器向我展示了一个内存错误(泄漏):
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等。