linux系统实现了X/Open规范,除了一些特殊的嵌入式应用程序外,linux程序绝不允许直接访问物理内存。也许应用程序看起来好像可以这样做,但这只是内核制造的一个假象。
linux为应用程序提供了巨大的可寻址地址空间,32位系统地址空间为4G,linux还提供了内存保护机制,避免不同的应用程序之间的相互干扰。实际上,linux系统的交换空间技术(swap),使得应用程序能够访问比实际物理内存更大的内存空间。
1.内存分配
使用标准C库函数中的malloc()来分配动态内存。
#include
void *malloc(size_t size);
如果请求分配的内存大小要比实际的物理内存大,并不会导致请求失败,这是因为:刚开始,内核只是通过使用空闲的物理内存满足应用程序的内存请求,当物理内存被耗尽时,系统就会开始使用所谓的交换空间(swap space)。在linux系统上,swap space是一个在安装系统时分配的独立的磁盘区域。内核会在物理内存和交换空间之间移动数据和程序代码,使得每次读写内存时,数据看起来总像是已存在于物理内存中。
linux系统中,如果不使用GNU C函数库,从0地址处读数据是不允许的,更不用说写操作了。如果使用GNU C函数库,还能够容忍对0地址的读操作。
两个不是很常用的内存分配函数:
void *calloc(size_t numer_of_elements,size_t element_size);
void *realloc(void *existing_memory,size_t new_size);
calloc是为一个结构数组分配内存,因此需要把元素个数和每个元素的大小作为参数,它所分配的内存将全部初始化为0,。calloc成功返回指向数组中第一个元素的指针。与malloc类似,后续的calloc调用无法保证能返回一个连续的空间。
realloc用来改变先前已经分配的内存块的长度,它需要传递一个指向先前通过malloc,calloc或realloc调用分配的内存的指针,然后根据new_size参数的值来增加或减少其长度,为了完成这个任务,realloc函数可能不得不移动数据,因此,在内存被重新分配之后,必须使用新的指针而不是realloc调用前的指针去访问内存。
如果realloc无法调整内存块的大小,它会返回一个NULL指针,因此下面的代码是绝对要避免的:
- ptr_alloc=malloc(SIZE);
- ......
- ptr_alloc=realloc(ptr_alloc,SIZE+5);
如果realloc调用失败,将导致ptr_alloc变为NULL,失去了以前分配的内存的地址,解决办法是使用一个临时变量temp,将temp作为realloc的返回值,而不是直接使用ptr_alloc保存realloc的返回值。
2.内存释放
#include
void free(void *ptr_to_memory);
释放malloc,realloc,calloc调用分配的内存。
free函数和alloc函数成对出现,是要养成的思维习惯。
阅读(324) | 评论(0) | 转发(0) |