好吧,又一次,这次编译器向我显示内存错误(泄漏):
otest(18015,0xacae32c0) malloc: * error for object 0x194e734: incorrect checksum for freed object - object was probably modified after being freed. * set a breakpoint in malloc_error_break to debug
我正在使用激活了 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 终止等等。
关于c++ - 为什么这段代码会泄露?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10840281/