【问题标题】:How to know the full size of memory allocated for a single program in C?如何知道 C 中为单个程序分配的全部内存大小?
【发布时间】:2018-06-19 09:10:06
【问题描述】:

检查程序结束时分配的程序总内存,因为我使用 free() 函数来释放数组。

【问题讨论】:

  • 标准库没有为此提供标准方法。你真正的问题是什么?根据系统的不同,有一些工具(如 valgrind)来控制动态内存使用情况。
  • 你想知道栈大小还是堆大小?
  • 您可以使用 valgrind 更好地了解内存。

标签: c malloc free dynamic-memory-allocation


【解决方案1】:

没有标准的方法可以知道这一点,并且“完整内存大小”的概念没有得到很好的定义(并且它的“分配”可能发生在malloc之外并且独立于malloc,例如在Linux上通过直接调用@ 987654321@等...)

在实践中(假设您的代码在台式机或笔记本电脑上的某个常见 operating system 上的 process 中运行),请考虑使用 virtual address space

阅读Operating Systems: Three Easy Pieces(可免费下载)。

在 Linux(但这是特定于 Linux 的)上,您可以使用 /proc/(有关详细信息,请参阅 proc(5))向内核查询虚拟地址空间和某些进程的状态。 pid 1234的进程,见/proc/1234/maps/proc/1234/status等。

您可以(并且可能应该)使用valgrind 来寻找memory leaks

使用 GNU glibc,您还可以使用 mallinfo(3)malloc_stats(3)(但它们是非标准的)等...

请注意 mallocfree 使用较低级别的系统调用,例如 mmap(2)munmap(或较旧的 sbrk(2) 等)来更改虚拟地址空间,但是free 通常不会使用munmap 向内核释放内存,但更愿意保留并标记已释放的内存区域以供malloc 将来使用。

如果您真的愿意,可以使用其他implementations of malloc(甚至提供您自己的)。但您通常不应该这样做。

【讨论】:

  • 我认为这里的 OP 关注的是程序所做的分配,而不是进程使用的实际空间。我认为他想要统计 malloc/frees。只是我的解释。
  • 因此我提到了valgrind & mallinfo
猜你喜欢
  • 2016-02-29
  • 2012-09-13
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2012-03-01
  • 2013-03-14
相关资源
最近更新 更多