鉴于双重自由错误(由valgrind报告),有没有办法找出内存的分配位置? Valgrind只告诉我释放站点的位置(即对free()
的调用),但我想知道内存已分配的位置。
答案 0 :(得分:9)
要让Valgrind跟踪分配堆栈跟踪,您必须使用选项:
--track-origins=yes --keep-stacktraces=alloc-and-free
Valgrind将在Block was alloc'd at
警告之后的Address ... inside a block of size x free'd
部分报告分配堆栈。
如果您的应用程序很大,--error-limit=no --num-callers=40
选项也可能有用。
答案 1 :(得分:0)
我要做的第一项检查是验证错误确实是由于双重释放错误引起的。有时,运行程序(包括valgrind)可能会显示出双重释放错误,而实际上这是内存损坏问题(例如内存溢出)。
最好的检查方法是应用答案中详述的建议:How to track down a double free or corruption error in C++ with gdb。
首先,您可以尝试使用标志fsanitize=address -g
编译程序。这将在运行时检测程序的内存,以跟踪所有分配,检测溢出等。
无论如何,如果问题确实是双重解决,则错误消息应包含所有必要的信息以供您调试问题。