当前位置: 首页 > 互联网, 翻译 > 正文

c语言常见关于动态内存的错误

C语言在使用动态分配内存时可能会出现很多错误。这其中包括:空指针取值,超出分配内存边界,释放非动态申请的内存块,试图释放动态内存块的一部分,继续使用被释放的动态内存。

首先,动态内存分配中最常见的错误是忘记检查请求分配的内存是否成功。

其次,动态分配内存的第二个错误根源是关于分配内存的边界。比如:你得到了一个25个整型数的数组,访问下标小于0或大于24的元素就可能产生两种类型的问题。

第一个问题很明显:要访问的内存可能存储着其它变量。改变它会破坏这个变量,改量变量将会破坏你存储在这里的值。这种类型的错误往往很难跟踪调试。

第二个问题就不太明显:一些malloc和free的调用将可用存储空间看作一个链接列表。修改分配内存边界外的地址会破坏这个列表,这可能会引起异常,而这样的异常很可能会终止程序。

当程序使用动态内存分配产生错误时,人们很容易将问题指向malloc和free函数。但是,它们并不是罪魁祸首。在实际过程中,程序中出现的问题常常是因为越界访问分配内存以外的空间。

使用free函数也可能产生各种不同的错误。传递给函数free的指针必需是由malloc, calloc, realloc函数得到的指针。当free函数以一个不是由动态内存分配的内存指针时,会造成程序立即终止或一段时间后终止。相同的问题还出现在试图释放动态分配内存块的部分内存空间时。比如:

pi = malloc( 10 * sizeof( int ) );//得到10个整型

free( pi + 5 ); //只释放最后5个整型数,只保留最初的5个。

C语言不允许释放块中的部分内存;只能整块内存的释放。当然,realloc函数可以动态分配块中更小的内存空间,并能高效的释放末尾不需要的内存空间。

最后,你必需仔细而不要访问被free函数释放掉的内存空间。警告很明显,但这毕竟是一个非常敏感的问题。假设指向动态分配内存块的指针拷贝有多个副本,并且这些副本运用于程序的各个不同块。这就很难确保内存块被释放掉后,程序的其它区域不再使用这个指针的副本。相反的,你还要保证释放内存之前,程序的所有部分都已完成对内存的访问。

本文固定链接: http://www.byhard.com/?p=885 | 海纳百川

该日志由 byhard 于2013年02月27日发表在 互联网, 翻译 分类下,
原创文章转载请注明: c语言常见关于动态内存的错误 | 海纳百川
关键字: ,
【上一篇】
【下一篇】

c语言常见关于动态内存的错误:目前有10 条留言

  1. 学习了,好历害,很专业呀,博主

    2013-02-28 13:10
    • byhard:

      别人很专业,我只是翻译了别人的文章而已,在学习中。

      2013-02-28 13:14
  2. 活到老学到老啊

    2013-02-28 13:18
    • byhard:

      人生就是如此啊。

      2013-02-28 14:19
  3. 好厉害。去学C语言时就头晕

    2013-02-28 22:56
    • byhard:

      一遍看不懂就看两遍,不懂就三遍,就这样头不晕了。呵呵!

      2013-03-01 08:51
  4. 板凳
    Harries:

    楼主是搞C的吗?

    2013-03-02 10:19
    • byhard:

      主要是C#.NET,在自学C语言。

      2013-03-02 20:39
  5. C语言在动态分配内存方面比不上java等拥有自动回收机制的语言。但是它的效率和对底层的掌控要好的多。成也指针,败也指针。

    2013-03-03 08:39
    • byhard:

      无论成败,关键在于使用的人吧。

      2013-03-03 09:10