c++ - 为什么这段代码会泄露?

标签 c++ ios memory memory-management memory-leaks

好吧,又一次,这次编译器向我显示内存错误(泄漏):

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/

相关文章:

c++ - 在 FOR 循环外定义的变量范围?

c++ - boost 概念检查 operator() 重载

c++ - 用一个 int 替换多个 bool 并使用位掩码的性能优势?

ios - 日期组件今天和明天两个日期之间的日差错误

c++ - 调整结构/字符数组的大小(以减少内存使用)

objective-c - 子类化 UITabBarController 的替代方法

objective-c - objective-c : making point Larger through long press

c - 将已定义结构的指针初始化为全局变量

c - 需要可执行堆栈和堆内存

java - 在java中,如果我扩展一个类并且在重新定义每个函数时不使用 super 字段,该字段是否仍然使用内存?