在没有内存泄漏的情况下替换char*

Mig*_*ork 6 c memory memory-leaks

我正在尝试创建一个查找和替换功能,它可以工作,但valgrind报告了巨大的内存泄漏.

看一看:

void repl(char** str) {

    // build a new string (simulating find&replace)

    char* replacement = (char*)malloc(7);
    strcpy(replacement, "my ass");

    // this causes "free(): invalid pointer" crash
    //free(*str);

    *str = replacement; // return to caller
}

/* main function */
int main (int argc, char **argv) {

    // out original string
    char* str = "memory leak here";
    repl(&str); // replace something 1st time
    repl(&str); // 2nd time
    repl(&str); // 3rd time

    printf("%s\n",str); // look at output

    exit(0);
}
Run Code Online (Sandbox Code Playgroud)

当"免费"到位时,您将获得:

*** glibc detected *** ./test: free(): invalid pointer: 0x0000000000401013 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f264e7ecb96]
....  
Run Code Online (Sandbox Code Playgroud)

free但是,如果不存在,则会出现内存泄漏(valgrind输出):

==26236== LEAK SUMMARY:
==26236==    definitely lost: 14 bytes in 2 blocks
==26236==    indirectly lost: 0 bytes in 0 blocks
==26236==      possibly lost: 0 bytes in 0 blocks
==26236==    still reachable: 7 bytes in 1 blocks
==26236==         suppressed: 0 bytes in 0 blocks
Run Code Online (Sandbox Code Playgroud)

我还没完全熟悉指针,所以请耐心等待.也许这不是最好的方法,所以请建议更好的查找和替换方法,没有内存泄漏.

我试着返回结果,但后来我也泄漏了.

Fil*_*efp 4

怎么了glibc

glibc诊断与以下事实有关:str并不总是指向由 分配的内存段malloc,这是 的要求之一free。换句话说; 您第一次使用指向未分配内存段repl的值进行调用将导致行为不当。strfree


怎么了valgrind

valgrind 诊断之所以存在,是因为如果没有您(当前出现故障)使用,则内部free分配的内存永远不会被释放,因此;你正在泄漏内存。mallocrepl


建议的解决方案

我觉得最好用语言解释它,而不是给你一个有效的实现,因为你似乎渴望通过实践来学习。

  1. 不接受指向 char 的指针,而是接受 apointer-to-char并返回指向新内存段的指针,该新内存段由传入字符串的修改版本组成。这个新内存段已通过 分配malloc

  2. 重命名您的函数以明确它正在分配需要释放的内存,

  3. 记录你的函数,以便调用者知道它负责free内存,而不是你的replace-function