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)
我还没完全熟悉指针,所以请耐心等待.也许这不是最好的方法,所以请建议更好的查找和替换方法,没有内存泄漏.
我试着返回结果,但后来我也泄漏了.
怎么了glibc?
该glibc诊断与以下事实有关:str并不总是指向由 分配的内存段malloc,这是 的要求之一free。换句话说; 您第一次使用指向未分配内存段repl的值进行调用将导致行为不当。strfree
怎么了valgrind?
valgrind 诊断之所以存在,是因为如果没有您(当前出现故障)使用,则内部free分配的内存永远不会被释放,因此;你正在泄漏内存。mallocrepl
建议的解决方案
我觉得最好用语言解释它,而不是给你一个有效的实现,因为你似乎渴望通过实践来学习。
不接受指向 char 的指针,而是接受 apointer-to-char并返回指向新内存段的指针,该新内存段由传入字符串的修改版本组成。这个新内存段已通过 分配malloc,
重命名您的函数以明确它正在分配需要释放的内存,
记录你的函数,以便调用者知道它负责free内存,而不是你的replace-function。