在使用动态内存分配的程序中,常常会出现许多错误。这些错误包括对NULL指针进行解引用操作、对分配内存进行操作时越过边界、释放并非内存分配的内存、试图释放一块动态分配的内存的一部分及一块动态内存被释放之后被继续使用。
动态内存分配错误主要有两大来源。
最常见的错误就是忘记检查所请求的内存是否成功分配。这种类型的bug难以发现,下面程序展现了一种技巧,可以很可靠进行这个错误检查。
/* 定义一个不易发生错误的内存分配器 */
#include <stdlib.h>
#define malloc
#define MALLOC( num, type ) ( type *)alloc( ( num ) * sizeof( type ) )
extern void *alloc( size_t size );
/* 不易发生错误的内存分配器的实现 */
#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( "Out of memory!\n" );
exit( 1 );
}
return new_mem;
}
/* 一个使用很少引起错误的内存分配器的程序 */
#include "alloc.h"
void function()
{
int *new_memory;
/* 获得一串整型数的空间 */
new_memory = MALLOC( 25, int );
/* ... */
}