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

时间:2011-07-26 19:49:09

标签: c memory-management malloc free

mallocfree完成的C内存分配/解除分配。

newdelete完成的C ++内存分配/解除分配中。

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

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

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

C中是否有 AUTOMATIC 内存管理的解决方案?

C是否有任何指导方针或类似内容?

我想要忘记free一块记忆:

  • 我的代码无法编译

- 或 -

  • 内存自动解除分配

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

3 个答案:

答案 0 :(得分:12)

答案 1 :(得分:2)

作为answered by Juraj Blaho,您可以使用垃圾收集库,例如Boehm conservative garbage collector,但还有其他库:Ravenbrook's memory pool system,my(unmaintained)Qish GC,{ {3}}等等......

通常,您可以编写自己的Matthew Plant's GC专用于您的用例。您可以在C中使用您的问题中提到的技术(智能指针,引用计数),但您也可以实现标记&扫描GC或复制GC。

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

我强烈建议您阅读有关GC的更多信息,例如: garbage collector。这些算法在很多情况下都很有用。

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

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

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

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

答案 2 :(得分:0)

对于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

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