[原创]基于Blackfin系列的数组vs.动态申请
0赞
发表于 2011/9/16 22:32:06
阅读(2188)
今天在给Blackfin写一个驱动时,出了个小小问题,却发现了大大的惊喜,写出来跟大家一起交流!!!
在嵌入式系统中动态内存申请存在比一般系统编程时更严格的要求,这是因为嵌入式系统的内存空间往往是十分有限的,不经意的内存泄露会很快导致系统的崩溃。
所以一定要保证你的malloc和free成对出现:
char * function(void)
{
char *p;
p = (char *)malloc( … );
if(p==NULL)
… ;
… /* 一系列针对 p 的操作 */
return p;
}
{
char *p;
p = (char *)malloc( … );
if(p==NULL)
… ;
… /* 一系列针对 p 的操作 */
return p;
}
在某处调用
function(),用完
function中动态申请的内存后将其
free,如下:
char *q = function();
…
free(q);
…
free(q);
上述代码明显是不合理的,因为违反了
malloc和
free成对出现的原则,即"谁申请,就由谁释放"原则。不满足这个原则,会导致代码的耦合度增大,因为用户在调用function函数时需要知道其内部细节!
正确的做法是在调用处申请内存,并传入
function
函
数
。
char *p=malloc(…);
if(p==NULL)
…;
function(p);
…
free(p);
p=NULL;
if(p==NULL)
…;
function(p);
…
free(p);
p=NULL;
而函数
function
则接收参数
p
void function(char *p)
{
…/*一系列针对p的操作*/
}
{
…/*一系列针对p的操作*/
}
因此
原则:
(1)尽可能的选用数组(动态申请内存方式可以用较大数组替换),数组不能越界访问
(2)如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!
(1)尽可能的选用数组(动态申请内存方式可以用较大数组替换),数组不能越界访问
(2)如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!
小小问题,大大文章