如何知道为 C 中的单个程序分配的内存的完整大小?
How to know the full size of memory allocated for a single program in C?
检查程序结束时分配的程序总内存,因为我使用 free() 函数来释放数组。
没有标准的方法知道这一点,"full size of memory" 的概念没有明确定义(它的 "allocation" 可能发生在 malloc
之外并独立于 malloc
,例如 Linux 通过直接调用 mmap(2) 等...)
在实践中(假设您的代码是 运行 在 process on some common operating system on a desktop or laptop), think instead in terms of virtual address space.
阅读 Operating Systems: Three Easy Pieces(可免费下载)。
在 Linux 上(但这是 Linux 特定的)您可以使用 /proc/
(有关详细信息,请参阅 proc(5))来查询内核有关虚拟地址的信息 space 和一些进程的状态。 pid 1234的进程见/proc/1234/maps
和/proc/1234/status
等
您可以(并且可能应该)使用 valgrind to hunt memory leaks。
使用 GNU glibc, you also have mallinfo(3) & malloc_stats(3)(但它们是非标准的)等...
请注意 malloc
和 free
使用较低级别的系统调用,例如 mmap(2) & munmap
(或较旧的 sbrk(2 ), 等等...) 来更改虚拟地址 space,但是 free
通常不会使用 munmap
向内核释放内存,而是更喜欢保留和通过 malloc
.
标记释放的内存区域以备将来使用
如果您确实愿意,可以使用其他 implementations of malloc
(甚至提供您自己的)。但你通常不应该。
检查程序结束时分配的程序总内存,因为我使用 free() 函数来释放数组。
没有标准的方法知道这一点,"full size of memory" 的概念没有明确定义(它的 "allocation" 可能发生在 malloc
之外并独立于 malloc
,例如 Linux 通过直接调用 mmap(2) 等...)
在实践中(假设您的代码是 运行 在 process on some common operating system on a desktop or laptop), think instead in terms of virtual address space.
阅读 Operating Systems: Three Easy Pieces(可免费下载)。
在 Linux 上(但这是 Linux 特定的)您可以使用 /proc/
(有关详细信息,请参阅 proc(5))来查询内核有关虚拟地址的信息 space 和一些进程的状态。 pid 1234的进程见/proc/1234/maps
和/proc/1234/status
等
您可以(并且可能应该)使用 valgrind to hunt memory leaks。
使用 GNU glibc, you also have mallinfo(3) & malloc_stats(3)(但它们是非标准的)等...
请注意 malloc
和 free
使用较低级别的系统调用,例如 mmap(2) & munmap
(或较旧的 sbrk(2 ), 等等...) 来更改虚拟地址 space,但是 free
通常不会使用 munmap
向内核释放内存,而是更喜欢保留和通过 malloc
.
如果您确实愿意,可以使用其他 implementations of malloc
(甚至提供您自己的)。但你通常不应该。