Valgrind 检测到内存泄漏,找不到它 C

Posted

技术标签:

【中文标题】Valgrind 检测到内存泄漏,找不到它 C【英文标题】:Valgrind detects memory leak, can't find it C 【发布时间】:2020-05-01 23:41:55 【问题描述】:

Valgrind 正在发现内存泄漏,但我似乎无法确定它们,我希望这里有人可以帮助我:

主要电话是Dictionary* dictionary = initDictionary();

【问题讨论】:

不要发布代码图片 还有don't cast malloc 以后,请尝试创建一个minimal reproducible example 来复制问题,并将其展示给我们。请阅读(或刷新)how to ask good questions,以及this question checklist。 我想知道为什么你的编译器没有发出任何警告你的initDictionary 没有返回一个声明的指针。你的主线是什么样子的?如果您曾经执行过 Dictionary *d = initDictionary() ,编译应该会失败(除非您在方法本身中遇到失败条件,导致它返回 0)。所以我怀疑你的主要内容也有问题...... -Wall -Wextra编译 【参考方案1】:

您的 initDictionary 不会在任何地方返回指针 dictionary

这意味着当你这样做时

Dictionary* dictionary = initDictionary();

dictionary 的值将是不确定的(看似随机或垃圾),取消引用此指针或将其传递给free 将导致undefined behavior

你可以通过添加一个简单的方法来解决这个问题

return dictionary;

initDictionary 函数的末尾。


如果你的编译器没有警告你没有从函数返回任何东西,你需要启用更详细的警告。在构建时使用gccclang 我推荐选项-Wall -Wextra -Wpedantic。对于 MSVC,请使用 /W4

【讨论】:

以上是关于Valgrind 检测到内存泄漏,找不到它 C的主要内容,如果未能解决你的问题,请参考以下文章

Unix下C程序内存泄漏检测工具Valgrind安装与使用

C ++中地牢爬行者的多类级别构造函数中的Valgrind内存泄漏

Valgrind进行内存泄漏检测

valgrind - 检查程序中的内存泄漏问题

Valgrind - 打开 Windows 内存转储

使用 Valgrind 检测 C++ 内存泄漏