这是我编写的一个非常简单的程序,用于显示 Mac (El Capitan) 和 Linux Mint 17.2 上的 valgrind 输出之间的差异。
有没有办法在 mac 上获得相同类型的输出?我不明白为什么它在 Mac 上显示的堆使用量比在 Linux 上多?
出于一个奇怪的原因,Linux Mint 显示正在释放的内存,而 OSX 没有
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char const *argv[]) {
char *str = (char *)malloc(15);
strcpy(str, "Hello World!");
printf("%s\n", str);
free(str);
return 0;
}
最佳答案
C 标准库和运行时在调用 main
之前做一些事情,printf
也在内部做一些事情。这个“东西”可能包括内存分配。这是特定于实现的,因此完全不同的实现显示不同的分配量也就不足为奇了。
然后,当程序退出时,实际上可能没有必要释放
任何堆分配,因为当进程终止时,堆将消失,噗,被删除操作系统(在像上面两个一样的桌面操作系统中)。应用程序代码应该 释放它分配的所有内存(因为可移植性,因为那时您实际上可以使用像 valgrind 这样的工具,因为它是“干净的”)。但是对于平台和编译器特定的库代码,它只会减慢每个程序的退出速度,没有任何好处。所以库不这样做基本上是一种优化,您通常不应该在自己的程序中这样做(除非您可以实际测量它在某处产生影响)。
因此像 valgrind 这样的工具通常包含已知未释放内存块的禁止列表。您还可以为您使用的任何库配置您自己的禁止列表,这些库不会在程序退出时释放所有内存。但是在使用抑制时,最好确保您抑制的是安全情况,而不是隐藏实际的内存泄漏。
推测:因为此处分配数量的差异相当大,有人可能会猜测,Linux 实现仅使用静态/全局变量,而 Mac 实现也使用堆分配。存储在那里的实际数据可能包括诸如 stdin/stdout/stderr 缓冲区之类的东西。现在这只是一个猜测,我没有检查源代码,但目的是让您了解可能需要分配什么。
关于C - Mac 上的 Valgrind 显示与 linux 不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726021/