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()两个系统调用来实现。