古代的剑客们与
对手相逢时,无
论对手多么强大,
明知不敌,也要亮出自己的剑!
读者:我有个程序分配了大量的内存, 然后又释放了。但是从操作系统看, 内存的占用率却并没有回去。
小林:多数 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() 分配的内存。
有时候,正是那些意想不到之人,成就了无人能成之事。
——图灵