【问题描述】动态分配内存是C语言的重要组成部分,如何安全有效的进行动态内存分配呢?下面对一些技巧进行小结。
【小技巧】
1 安全分配内存(malloc)
malloc的函数原型如下:
void *malloc(size_t size);
在分配内存时,常采用类似如下代码,分配25个单位的int类型内存:
p = malloc(25*sizeof(int));
这个代码乍看起来没有什么问题,实际上犯了一个常见的错误,那就是没有对p是否分配内存成功进行检查。对没有分配成功的内存进行访问是十分危险的。正确的代码如下:
p = malloc(25*sizeof(int));
if(p == NULL)
{
perror("malloc");
exit(1);
}
《C和指针》介绍了一种安全分配内存的,封装方法(P224),此处不再详述:
alloc.h
#include <stdlib.h>
#define malloc //不要直接调用malloc
#define MALLOC(num,type) (type*)alloc((num)*sizeof(type));
extern void *alloc(size_t size);
alloc.c
#include <stdio.h>
#include "alloc.h"
#undef malloc
void *alloc(size_t size)
{
void *new_mem;
new_mem = malloc(size);
if(new_mem == NULL)
{
printf("mallioc fail\n");
exit(1);
}
return new_mem;
}
test.c
#include "alloc.h"
void function()
{
int *new_mem;
new_mem = MALLOC(25,int);
/*...*/
}
2 安全释放内存(free)
释放内存之前要检查内存是否为空,释放内存后,要将指针指向NULL,防止“野指针”。
所谓“野指针”就是指那些已经释放掉内存的指针,当调用free(p)时,内存被释放掉,当仍然可以读写p指向的内存,这样就会造成无法预料的错误。
安全释放内存的代码如下(来源于《系统程序员成长计划》):
#define SAFE_FREE(p) if(p != NULL) {free(p); p = NULL;}
3 内存碎片
malloc所分配的是一块连续的内存,内存碎片的产生实质上是多次malloc产生的。因此,可以猜测,对malloc的内存进行适当的预测,减小malloc的使用频率,可以有效减小内存碎片。经验值是一次分配1.5倍于实际需要的内存。
4 可移植性
比较如下代码:
代码1
p = malloc(100);
代码2
p = malloc(25*sizeof(int));
在32位机器上,他们分配的内存是相同的。但代码2的可移植性更强。因为代码2在不同的机器上,总是可以保证分配25单位的int类型内存。
5 内存越界
如代码2所示,分配了25单位的内存。千万不要尝试访问下标值小于0或大于24的内存,这样会因为内存越界,而修改破坏其他变量。
后续更新,未完待续...
转载请标明出处,仅供学习交流,勿用于商业目的
Copyright @ http://blog.youkuaiyun.com/tandesir