c - 即使在我释放它之后,Valgrind 也发现了字符串的内存泄漏

标签 c memory-management memory-leaks valgrind

在我的程序中,我在链表中​​声明了一些节点:

node_t* newSymbol = malloc(sizeof(node_t));

newSymbol->symbol.name = strdup(name); //name is a (const) char* that is a parameter to function I'm in.
newSymbol->symbol.addr = addr;

我使用 strdup 是因为像这样直接将符号名称分配给参数:

newSymbol->symbol.name = name;

说当我丢弃传递的参数的 const 属性时出现错误。

问题:我在另一个堆栈溢出中读到,您需要释放由 strdup 创建的内存。当我的程序退出时,我对每个节点执行以下操作:

free((void*)node->symbol.name);//free the memory allocated by strdup
free((void*)node);//here I free the node itself

我已经设法解决了所有泄漏问题,除了一个:

8 bytes in 1 blocks are definetely lost in loss record 1 of 1
    at 0x4C2DB6B: malloc (vg_replace_malloc.c:299)
    by 0x4ECE489: strdup (in /usr/lib64/libc-2.25.so)
    by 0x400EE7: symbol_add (symbol.c:117)

我检查了 symbol.c 的第 117 行,果然它就是我在上面粘贴的使用 strdup 的地方。我不确定如何清除与此相关的内存,以免出现任何内存泄漏。请帮忙!非常感谢。

最佳答案

因为代码片段似乎是正确的,基本假设应该是您strdup到一个已经分配的指针

要解决这个问题,我会添加:

/* free memory if it is already allocated */
if ( newSymbol->symbol.name ) 
    free( newSymbol->symbol.name);
newSymbol->symbol.name = strdup(name); //name is a (const) char* that is a parameter to function I'm in.
newSymbol->symbol.addr = addr;

虽然重要的是要提到即使它解决了问题,我还是建议继续调试您的代码,因为看起来您实际上并没有正确释放内存

希望对你有帮助...

关于c - 即使在我释放它之后,Valgrind 也发现了字符串的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755654/

相关文章:

c++ - 旋转时照明的 GL_POINT_SPRITE_ARB(广告牌)问题

c - 反 C(字符 + 字符)

c++ - 如何防止 mmap() 分配的内存空间被 'new' 调用分配?

c++ - 尝试使用 ffmpeg C API 取消执行和删除文件

Python struct.pack 导致内存泄漏,即使在删除对象后也是如此

c - 在 32 位 Debian Squeeze 下编译的 C 程序导致我 friend 的 64 位程序出现段错误

c - 使用带有参数的 GDB

使用 & 和不使用 & 的 C 3d 数组指针衰减

Python - 读取和删除文件的顶行而不将其加载到内存中

即使被杀死和处置(在 Linux 上),C# 启动进程也会泄漏内存