分类:
2008-11-18 15:44:37
7.8 memory allocation
#include void *malloc(size_t size); void *calloc(size_t nobj, size_t size); void *realloc(void *ptr, size_t newsize); |
All three return: non-null pointer if OK, NULL on error |
void free(void *ptr); |
使用这几个函数分配的内存,是在heap上。
倒是有一个函数叫alloca他能够在stack里分配空间,但是这个空间你不能释放,等函数接受后,自己释放。他会expand一个函数的stack frame。有些系统在函数已经进入了调用,stack frame已经建立好的情况下不能在expand 他的stack frame了,那么就不支持alloca了。Linux是支持的。有个鸟用?
注意,真正分配的内存比你看到的大,因为在你分配的内存空间前面几个字节,会保留一定的数据用来记录这个block的大小以及下一个分配的block的位置。所以如果你在你的指针位置前面或者分配的空间结尾的后面写入数据,有可能就将另一个被分配的空间的block写乱了。
可以测试一下:
连续2次分配10个字节,得到的位置并不是相连的,中间中会差出4个或多个字节,那么这些字节就是干这个用了。
上述函数分配内存使用的是sbrk这个系统调用。但是当你free了一个内存后,你的系统并没有看到空余空间多了,为什么呢?因为它并没有被放到空余空间,而是放到了malloc pool,以备下一次malloc分配能够迅速地获得所需的空间而不用再去查找。
由于malloc和free系列函数容易出错,因此产生了一些库,他们实现了自己的malloc,free功能,而且较为安全。如libmalloc.