常见的动态内存分配错误

六月ゝ 毕业季﹏ 提交于 2020-02-07 03:53:23

在使用动态分配的内存时,常出现的错误为:对null指针进行解引用操作(*),对分配的内存进行操作时越过边界,释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后被继续使用。

传递给free的指针必须是从malloc、calloc、realloc函数返回的指针,传给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。试图释放一块动态分配的内存的一部分也可能引起类似问题。例如

pi = malloc(10 * sizeof(int));

free(pi + 5);//释放后五个

这样企图释放内存的一部分是不容许的,必须整块一起释放。但realloc函数可以缩小一块动态分配的内存,有效释放它尾部的部分内存。

注意不要访问已经被free释放掉的内存,如果对指向动态分配的内存指针进行了复制,而且这个指针的几份copy散布于程序各处,则无法保证当年使用其中一个指针时它指向的内存是不是已被另一个指针释放(野指针,应将这些指针全部指向NULL)。另外必须保证程序中所有使用这块内存的地方在这块内存被释放之前停止对它的使用。

------------------------

动态分配内存最常见的错误是忘记检测所请求的内存是否分配成功。可以用一下方式进行改进:

#include<stdlib.h>

#define malloc   //用于防止由于其他代码块直接塞入程序而导致的偶尔直接调用                             //malloc的行为,增加此句,如果直接调用了malloc,程序报错

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

extern  void *alloc (size_t size);

-------------

#include <stdio.h>

#include "alloc.h"

#undef malloc    //此处加上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)

  ……

}

--------------------------------

动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界。

当动态分配的内存不再需要使用时,就应该释放掉,防止内存泄露。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!