C free函数

有了动态内存分配,程序员可以将不再使用的内存返还给系统,这样可以释放内存留作他用。通常用free函数实现这一点,该函数的原型如下:

void free(void *ptr);

指针参数应该指向由malloc类函数分配的内存的地址,这块内存会被返还给堆。尽管指针仍然指向这块区域,但是我们应该将它看成指向垃圾数据。稍后可能重新分配这块区域,并将其装进不同的数据。

在下面这个简单的例子中,pi指向分配的内存,这块内存最终会被释放:

int *pi = (int*) malloc(sizeof(int));
...
free(pi);

图2-8说明了free函数执行前后瞬间内存的分配情况。地址500处的虚线框表示内存已经释放,但仍然有可能包含原值,pi变量仍然指向地址500。这种情况称为迷途指针,会在迷途指针详细讨论。

图2-8:用free释放内存

如果传递给free函数的参数是空指针,通常它什么都不做。如果传入的指针所指向的内存不是由malloc类的函数分配,那么该函数的行为将是未定义的。在下例中,分配给pi的是num的地址,不过这不是一个合法的堆地址:

int num;
int *pi = #
free(pi); // 未定义行为

注意 应该在同一层管理内存的分配和释放。比如说,如果是在函数内分配内存,那么就应该在同一个函数内释放它。

将已释放的指针赋值为NULL

已释放的指针仍然可能造成问题。如果我们试图解引一个已释放的指针,其行为将是未定义的。所以有些程序员会显式地给指针赋NULL来表示该指针无效,后续再使用这种指针会造成运行时异常。

下面是该方法的示例:

int *pi = (int*) malloc(sizeof(int));
...
free(pi);
pi = NULL;

内存分配如图2-9所示。

enter image description here

图2-9:调用free后给指针赋值NULL

这种技术的目的是解决迷途指针类问题。不过,花时间处理造成这类问题的条件要比粗暴地用空指针一刀切好,更何况除了初始化的情况,都不能将NULL赋给指针。

赞(2)

评论 抢沙发

评论前必须登录!

 

C指针