【问题标题】:How can I do automatic memory management in C?如何在 C 中进行自动内存管理?
【发布时间】:2011-10-13 17:19:56
【问题描述】:

在 C 中由 mallocfree 完成的内存分配/释放。

在 C++ 中由 newdelete 完成内存分配/释放。

C++ 中有一些自动内存管理的解决方案,例如:

  • 智能指针。
  • RAII(资源获取正在初始化)
  • 引用计数和循环引用
  • ...

但是如何在 C 中进行自动内存管理?

在 C 中AUTOMATIC内存管理有什么解决方案吗?

C 有什么指导方针或类似的东西吗?

当我忘记free 时,我想要一块内存:

  • 我的代码无法编译

-- 或--

  • 内存自动释放

然后我说:哦,C 比 C++、Java 和 C# 更好。 :-)

【问题讨论】:

标签: c memory-management malloc free


【解决方案1】:

对于 linux,我使用 valgrind。当然,构建 valgrind 的最初原因是为了调试您的代码,但它还有更多功能。它甚至会以非侵入性的方式告诉您潜在的错误代码可能在哪里。我自己选择的命令行如下。

# Install valgrind. Remove this line of code if you already have it installed
apt install valgrind
# Now, compile and valgrind the C
gcc main.c -Werror -fshort-enums -std=gnu11 -Og -g3 -dg -gdwarf-2 -rdynamic -o main
valgrind --quiet --leak-check=yes --tool=memcheck -Wall  ./main

希望这会有所帮助。 ~ 快乐编码!

【讨论】:

    【解决方案2】:

    【讨论】:

    • 它是 C 中内存管理方法的一个很好的参考
    【解决方案3】:

    作为answered by Juraj Blaho,你可以使用垃圾回收库,比如Boehm conservative garbage collector,但还有其他的:Ravenbrook's memory pool system、我的(未维护的)Qish GCMatthew Plant's GC等...

    通常,您可以编写自己的 garbage collector 专门针对您的用例。您可以在 C 中使用问题中提到的技术(智能指针、引用计数),但您也可以实现标记和清除 GC,或复制 GC。

    编写 GC 代码时的一个重要问题是跟踪本地指针变量(用于垃圾收集的数据)。您可以将它们保存在本地 struct 并将它们链接在一起。

    我强烈建议阅读有关 GC 的更多信息,例如GC handbook。那里的算法在许多情况下都很有用。

    您甚至可以自定义您的 GCC 编译器(例如使用 MELT)来为您的特定 GC 实现添加检查或生成代码(例如扫描局部变量的代码)。或者你可以为此使用一些预处理器(例如GPP

    在实践中,Boehm 的 GC 通常足够好。

    请注意,某些数据的活跃度是整个程序的属性。因此,最好在软件开发的设计阶段尽早考虑 GC。

    另请注意,通过静态源代码分析可靠地检测到 memory leaks 通常是不可能的 (undecidable),因为可以证明它等同于 halting problem

    【讨论】:

      猜你喜欢
      • 2017-05-14
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多