读书人

动态内存分配小技艺

发布时间: 2012-08-15 16:57:16 作者: rapoo

动态内存分配小技巧

【问题描述】动态分配内存是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 mallocvoid *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.csdn.net/tandesir

读书人网 >编程

热点推荐