malloc分析

尴尬的realloc

(  近期我在学习linux,是一名代码初学者。昨天看了一些相关的书,看到realloc的使用时,发现了老师以前讲到的内存泄漏问题,我觉得这个问题虽然很小,但仍旧需要在写代码时时刻注意,于是在参考书的帮助下,写下这篇博客,也希望可以帮助大家深入理解相关知识)

        在扩容空间时,我们会用到C库中的“realloc”函数,对于良好的代码风格,有一项很重要的要求是一个函数只专注于做一件事,如果该函数像军刀一样能够实现多种功能,那基本上可以断言这不是一个设计良好的函数。

在realloc中,函数原型为:

#include <stdlib.h>

void *realloc(void *ptr, size_t  size);

(realloc函数可以将ptr指向的内存调整为size大小)

 这个功能看上去很简单,其实不然,在ptr和size取特殊值时,realloc就会产生三种不同的行为,很容易引入bug

1:参数ptr为NULL,而size不为0,则realloc函数就会退化成 malloc(size)

2:参数ptr不为NULL,而size为0, 则realloc函数退化成 free(ptr)

3:参数ptr和size都不为0,则函数功能就等同于 free(ptr); 然后malloc(size)

下面来列举一个在使用realloc时不经意间产生的bug:

void *ptr = realloc( ptr, newsize); //将ptr指向的内存调整为newsize

if( ptr == NULL)

{

          printf("errorn\n"); //如果扩容失败,输出一个“error”

          return;

}

        这里就就会因为realloc的第三种行为在不经意间引入一个bug。即:当realloc分配内存失败时,ptr就会返回NULL,但是此时ptr原来指向的内存并没有被释放,可是ptr却由被重新赋值为NULL,这就会引起内存泄漏。

正确的做法为:

void *newptr = realloc( ptr , newsize);   //引入一个新指针指向扩容的空间

if( newptr == NULL)  //如果扩容失败,原来的空间就不会丢失

{

           printf("error\n");

           return;

}

ptr = newptr;  //如果新空间申请成功,再把空间的“名字”换成和以前一样的,这样就不会引起内存泄漏

         当然,这只是其中的一个例子,其他两种特殊情况也会引起其他的bug,但从这个例子中我们需要注意的是,在使用realloc时,一定要确保再ptr 和 size在去特殊值时也可以正常使用,甚至最好用malloc代替realloc使用。

(参考书:Linnux环境编程:从应用到内核)

猜你喜欢

转载自blog.csdn.net/xing1584114471/article/details/82990819
今日推荐