由malloc
和free
完成的C内存分配/解除分配。
在new
和delete
完成的C ++内存分配/解除分配中。
C ++中有一些用于自动内存管理的解决方案,如:
但是如何在C中进行自动内存管理?
C中是否有 AUTOMATIC 内存管理的解决方案?
C是否有任何指导方针或类似内容?
我想要忘记free
一块记忆:
- 或 -
然后我说: 哦,C比C ++,Java和C#好。 : - )
答案 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
希望这会有所帮助。 〜快乐的编码!