顺便聊一下基础知识 | 每日一面(54)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:我有个程序分配了大量的内存, 然后又释放了。但是从操作系统看, 内存的占用率却并没有回去。

小林:多数 malloc/free 的实现并不把释放的内存返回操作系统, 而是留着供同一程 序的后续 malloc() 使用。

读者:free() 怎么知道有多少字节需要释放?

小林:malloc/free 的实现会在分配的时候记下每一块的大小, 所以在释放的时候就 不必再考虑了。

读者:那么我能否查询 malloc 包, 可分配的最大块是多大?

小林:不幸的是, 没有标准的或可移植的办法。某些编译器提供了非标准的扩展。

读者:向 realloc() 的第一个参数传入空指针合法吗?

小林:ANSI C 批准了这种用法, 以及相关的 realloc(. . . , 0), 用于释放, 尽管一些早 期的实现不支持, 因此可能不完全可移植。向 realloc() 传入置空的指针可以更容 易地写出自开始的递增分配算法。

读者:calloc() 和 malloc() 有什么区别?利用 calloc 的零填充功能安 全吗?free() 可以释放 calloc() 分配的内存吗, 还是需要一个 cfree()?

小林:calloc(m, n) 本质上等价于 p = malloc(m * n); memset(p, 0, m * n); 填充的零是全零, 因此不能确保生成有用的空指针值或浮点零值。free() 可以安全地用来释放 calloc() 分配的内存。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完