动态内存分配小技巧

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

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值