V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mlzboy
V2EX  ›  问与答

关于c中的内存管理有什么好的方案?

  •  
  •   mlzboy · 2012-07-14 09:16:29 +08:00 · 3203 次点击
    这是一个创建于 4513 天前的主题,其中的信息可能已经有所发展或是发生改变。
    关于c中的内存管理有什么好的方案,初学了一段时间的c,开始写点东西,发现对malloc,free,这块不容易撑控,有没有自动能管理malloc,free的lib,或是别的方法 ,求指点
    5 条回复    1970-01-01 08:00:00 +08:00
    nino789pzw
        1
    nino789pzw  
       2012-07-14 10:37:35 +08:00
    有各种lib的 但是自己做memory management更合适更灵活吧
    Ricepig
        2
    Ricepig  
       2012-07-14 10:42:32 +08:00
    找一个为c编写的GC库?
    ssword
        3
    ssword  
       2012-07-14 11:06:29 +08:00
    手工管理内存的好处是可以精确地控制内存,但好处也仅止于此了。使用GC虽然会消耗相当一部分额外的内存,但可以让人生更快乐许多。

    C/C++的话boehm GC可以用,保守式的垃圾收集,malloc()来的内存就不需要人肉释放了 http://www.hpl.hp.com/personal/Hans_Boehm/gc/

    不过C/C++的GC有个坑,那就是我们的程序有了GC很不错,但是我们用的三方库是没有GC的,照样需要小心地管理这些资源。

    要自己管理内存,纯粹的人肉free()依然也是不靠谱的。

    C++的方案是通过RAII,将对象的生存周期与变量的生存周期保持一致;
    linux内核中通用的方案是给结构体留一个refcount字段做引用计数;
    nginx是弄一个内存池,处理一个http请求中用到的所有内存都来自于这个内存池,待处理完毕就一股脑把它释放掉;
    cocoa是内存池+引用计数,在一股脑的释放内存池时,如果一个对象还有被引用,那么就不释放它。这一来通过内存池可以负责释放临时对象,而常驻于内存的对象,则通过引用计数来管理。
    haohaolee
        4
    haohaolee  
       2012-07-14 11:48:23 +08:00
    果断用C++呗,支持C的编译器8成也支持C++
    xpfd
        5
    xpfd  
       2012-07-14 13:06:51 +08:00
    嵌入式表示从来不考虑GC问题,所有资源都是静态数组
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:33 · PVG 01:33 · LAX 09:33 · JFK 12:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.