当前位置:嗨网首页>书籍在线阅读

07-用户空间内存动态申请

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

11.3.1 用户空间内存动态申请

在用户空间动态申请内存的函数为malloc(),这个函数在各种操作系统上的使用是一致的,malloc()申请的内存的释放函数为free()。

malloc()的内存一定要被free(),否则会造成内存泄漏。理想情况下,malloc()和free()应成对出现,即谁申请,就由谁释放。例如下面的一段程序:

char * function(void)

{

char *p;

p = (char *)malloc(…);

if(p==NULL)

...;

... / 一系列针对p的操作 /

return p;

}

在某处调用function(),用完function()中动态申请的内存后将其free,如下:

char *q = function();

free(q);

上述代码并不合理的,因为违反了malloc()和free()成对出现的原则。不满足这个原则,会导致代码的耦合度增大,因为用户在调用function()函数时需要知道其内部细节。

较好的做法是在调用处申请内存,并传入function()函数,如下所示:

char *p=malloc(…);

if(p==NULL)

...;

function(p);

...

free(p);

p=NULL;

而函数function()则接收参数p,如下所示:

void function(char *p)

{

... / 一系列针对p的操作 /

}

完全让malloc()和free()成对出现有时候很难做到,即便如此,也应尽力将malloc()申请内存的释放限制在本模块范围之内。如果在A模块申请的内存需在B模块释放,一般而言,软件结构的设计可能存在问题。

对于Linux内核而言,C库的malloc()函数通常通过brk()和mmap()两个系统调用来实现。