美文网首页
关于使用ZLCollectionViewFlowLayout导致

关于使用ZLCollectionViewFlowLayout导致

作者: Riven2018 | 来源:发表于2018-05-16 23:09 被阅读0次

    在ZLCollectionViewFlowLayout里有一句代码导致了内存泄漏,具体是:


    1.jpg

    这用到了c语言的函数malloc方法,但是在使用完之后没有及时清理,下面科普一下。


    C语言的函数malloc和free

    (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数

       void * malloc(size_t size)
    

    动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。

       void  free(void *ptr)
    

    释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,free不会有任何作用。

    (2) C语言中典型用法
    [图片上传中...(1526454177015.jpg-84ad17-1526483153801-0)]

        T为任意数据类型
    
       T *p = ( T * )malloc( sizeof(T) * n)
    
       if(NULL= =p)
    

    {

       printf(“malloc fail!\n”);
    
       ……//相关资源收回的处理
    
       exit(-1);
    

    }

    … …//此过程不能改变指针p的指向,如果改变指针指向,那么后面free将会出错,因为这里free的并不是原来的p指针,而是改变后的。当然如果改变了p的指向,那么必须再free前,将p再指回原来的位置。这样就没问题了。

    free(p);

    p=NULL;

    注意:malloc后通常要对返回值进行判断,避免发生不必要的错误。

    注意,最好再p 被free掉后,加上p=NULL这句

    “野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。

    指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

    (3) 内存说明

    malloc函数动态申请的内存空间是在堆里(而一般局部变量存于栈里),并且该段内存不会被初始化,与全局变量不一样,如果不采用手动free()加以释放,则该段内存一直存在,直到程序退出才被系统,所以为了合理使用内存,在不适用该段内存时,应该调用free()。另外,如果在一个函数里面使用过malloc,最好要配对使用free,否则容易造成内存泄露(没有将内存还给自由存储区)。

    但是,往往会在free的时候发生段错误.

    正确的做法是这样:

    // 在分配之前加一句判断指针是否为空,防止产生内存泄露

    struct XXXX * ptr=NULL;
    if (ptr == NULL) {
    ptr = (struct XXXX *)malloc(num * sizeof(struct XXXX);

    }

    // 在释放之前加一句判断指针是否为空,防止产生异常
    if (ptr != NULL) {
    free(ptr);
    ptr = NULL;

    }

    补充:C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权。

    然而,这种自由可能会导致严重的内存管理问题,

    而这些问题可能导致程序崩溃或随时间的推移导致性能降级。

    内存泄漏(即 malloc() 内存在对应的 free() 调用执行后永不被释放)

    和缓冲区溢出(例如对以前分配到某数组的内存进行写操作)是一些常见的问题,

    它们可能很难检测到。


    因此解决办法是在最后把它给释放调,具体做法参考上面:

    free(columnHeight);
     columnHeight = NULL;
    

    相关文章

      网友评论

          本文标题:关于使用ZLCollectionViewFlowLayout导致

          本文链接:https://www.haomeiwen.com/subject/yvqvdftx.html