C语言学习笔记---常见的动态内存错误

x33g5p2x  于2022-02-16 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(283)

在使用动态内存分配时,经常会出现许多错误。这些错误包括对NULL指针进行操作,对分配内存操作时越过边界,释放非动态内存分配的内存,一块动态内存被释放后继续使用等。

动态分配内存最常见的错误就是忘记检查所请求的内存是否分配成功。为了避免每次分配内存后忘记检查,现在通过一段代码来有效的避免这个问题。

#define MALLOC(num,type) (type *)alloc( (num) * sizeof(type))

void *alloc(size_t size) {
	void *new_mem;
	/*请求所需要的内存,并检查确实分配成功*/
	new_mem = malloc(size);
	if(new_mem == NULL) {
		printf("内存分配失败!\r\n");
		exit(1);
	}
	return new_mem;
}

新建一个alloc.c文件,在里面通过alloc函数实现动态内存的申请,并检查内存分配是否成功。再通过宏定义将alloc函数封装为MALLOC函数。这样需要申请内存的时候,只需要调用MALLOC函数就行。

#include <stdio.h>
#include "alloc.h"

#define malloc 0

int main(int argc, char** argv) 
{
	int j;
	int *new_memory;

	new_memory = MALLOC(10,int);

	for(j=0; j<10; j++) {
		new_memory[j] = j*10;
	}
	for(j=0; j<10; j++) {
		printf("%d ",new_memory[j]);
	}
        
	free(new_memory);
        
	return 0;
}

接下来在主函数中调用MALLOC函数进行内存申请。这里有一个小技巧,首先使用define指令重新定义了malloc,这样如果在程序中如果无意中调用了malloc命令后,代码就会由于语法错误无法编译。在需要申请内存时,只需要调用alloc.c中的MALLOC函数,由于在MALLOC函数中已经对申请的内存空间做了判断,所以在主程序中申请内存空间时就不需要对申请的空间进行判断了。

内存空间申请成功后,向内存里面写入数据并打印出来。程序运行结果如下:

这样通过一个简单的封装就可以动态分配内存的隐患去掉了。

同样在使用free释放内存的时候也可能出现错误,传递给free的指针必须是一个从malloccallocrealloc函数返回的指针。释放内存的时候不能值释放一部分,必须整块一起释放。如果想要释放一部分内存的话,可以使用realloc函数来缩小申请的动态内存,这样剩下的一部分内存就会被是放掉。

要注意不能访问已经被free函数释放的内存,比如代码中对一块动态分配的内存指针进行了复制,而这个指针的几分拷贝已经散布于程序各个地方,所以在使用free函数释放内存时,一定要确保程序中所有访问这块内存的函数已经停止使用了。

相关文章