我写了一个简单的C程序,其中有两个数据结构实现为ADT,所以我为它们动态分配内存
一切都很好,直到我决定在结构中添加一个int值,没有动态分配,经典的简单静态内存分配,但自从我添加了它之后,我开始在一个非常安全的函数中使用segfault,这个函数根本不应该segfault。
我曾考虑过内存分配错误,所以我尝试不释放和重用我正在使用的指针变量,而是使用另一个变量,这样程序运行得很好。由于我不得不处理这种错误,我很生气,我重新启用了我之前说的免费软件,重新编译并用valgrind运行了一次。
令我惊讶的是,绝对没有内存泄漏,没有分段故障,没有任何形式的中断,只是关于Conditional jump or move depends on uninitialised value(s)
的警告,但这是一种需要的行为(if (pointer == NULL) { }
(,所以我直接从命令行运行了可执行文件,再次,一切都很好,所以情况是这样的:
结构中没有新int值的程序:
- 编译:检查
- 运行:检查
- Valgrind分析:没有内存泄漏,只是警告
- 调试(gdb(:检查
在结构中使用新的int值进行编程:
- 编译:检查
- 运行:检查
- Valgrind分析:没有内存泄漏,只是警告
- 调试(gdb(:Segfault
所以我认为这与Heisenbug相反,Heisenbug是一个只在调试时才会出现的bug,我该如何修复它?
好吧,多亏了@weather vane和@some程序员,我注意到实际上我没有初始化valgrind抱怨的变量,我误解了valgrind警告,我把它读成了You should not use a if to check if variables are NULL