C - Mac 上的 Valgrind 显示与 linux 不同的结果?

标签 c linux macos valgrind

这是我编写的一个非常简单的程序,用于显示 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;
}

Linux 薄荷 17.2 Linux Mint

Mac OSX El Capitan MacOSX

最佳答案

C 标准库和运行时在调用 main 之前做一些事情,printf 也在内部做一些事情。这个“东西”可能包括内存分配。这是特定于实现的,因此完全不同的实现显示不同的分配量也就不足为奇了。

然后,当程序退出时,实际上可能没有必要释放任何堆分配,因为当进程终止时,堆将消失,噗,被删除操作系统(在像上面两个一样的桌面操作系统中)。应用程序代码应该 释放它分配的所有内存(因为可移植性,因为那时您实际上可以使用像 valgrind 这样的工具,因为它是“干净的”)。但是对于平台和编译器特定的库代码,它只会减慢每个程序的退出速度,没有任何好处。所以库不这样做基本上是一种优化,您通常不应该在自己的程序中这样做(除非您可以实际测量它在某处产生影响)。

因此像 valgrind 这样的工具通常包含已知未释放内存块的禁止列表。您还可以为您使用的任何库配置您自己的禁止列表,这些库不会在程序退出时释放所有内存。但是在使用抑制时,最好确保您抑制的是安全情况,而不是隐藏实际的内存泄漏。


推测:因为此处分配数量的差异相当大,有人可能会猜测,Linux 实现仅使用静态/全局变量,而 Mac 实现也使用堆分配。存储在那里的实际数据可能包括诸如 stdin/stdout/stderr 缓冲区之类的东西。现在这只是一个猜测,我没有检查源代码,但目的是让您了解可能需要分配什么。

关于C - Mac 上的 Valgrind 显示与 linux 不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726021/

相关文章:

c - 如何将 int 作为 "void *"传递给线程启动函数?

linux - cgroups 隔离(分离组进程)

linux - 仅一次将 2 行添加到文件中,但下次在 shell 脚本中不形成

c - windows shell中jenkins中linux命令的使用

javascript - 如何在 safari 应用程序和从 safari 应用程序扩展资源文件夹加载的 html 页面之间进行通信

xcode - Brew升级不适用于最新的OSX High Sierra beta版本

c - 是否可以将数组从 Rust 传递到 C?

c - 将子进程标准输出重定向到 C 中的管道

c - 错误: subscripted value is neither array nor pointer nor vector in C

ios - 是保存: method thread-safe?