这是我编写的一个非常简单的程序,用于显示Mac(El Capitan)和Linux Mint 17.2上的valgrind输出之间的差异.
有没有办法在Mac上获得相同类型的输出?我不明白为什么它在Mac上比在Linux上显示更多的堆使用情况?
出于一个奇怪的原因,Linux Mint显示了正在释放的内存,而OSX却没有
<code>#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("%sn", str);
free(str);
return 0;
}
</code>
Linux Mint 17.2
Mac OSX El Capitan
解决方法:
C标准库和运行时在调用main之前先进行处理,而printf也在内部进行处理.此“内容”可能包括内存分配.这是特定于实现的,因此完全不同的实现显示不同的分配量也就不足为奇了.
然后,当程序退出时,实际上可能没有必要释放任何堆分配,因为当进程终止时,堆将被操作系统删除(在上面两个都是这样的桌面操作系统中).应用程序代码应释放它分配的所有内存(因为具有可移植性,并且因为那时您可以实际使用valgrind之类的工具,并且因为它是“干净的”).但是对于平台和编译器特定的库代码,这只会减慢每个程序的退出速度,而不会带来任何好处.因此,不这样做的库基本上是一种优化,通常您不应该在自己的程序中进行这种优化(除非您可以实际衡量出它在某个地方有所作为).
因此,诸如valgrind之类的工具通常包含已知未释放内存块的禁止列表.您还可以为使用的任何库配置自己的禁止列表,这些库不会在程序退出时释放所有内存.但是在使用抑制时,最好确保抑制安全情况,并且不要隐藏实际的内存泄漏.
推测:由于此处分配数量的差异非常大,因此可能引起猜测:Linux实现仅使用静态/全局变量,而Mac实现也使用堆分配.并且那里存储的实际数据可能包括诸如stdin / stdout / stderr缓冲区之类的数据.现在这只是一个猜测,我没有检查源代码,但是目的是让您了解可能需要哪些分配.
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!