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

在C内存分配/释放由mallocfree

在C ++内存分配/解除分配由newdelete

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

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

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

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

对于C,有没有任何指导或类似的指导?

我想要free一块内存:

  • 我的代码没有编译

– 要么 –

  • 内存自动解除分配

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

您可以使用Boehm垃圾收集器库 。

正如Juraj Blaho所回答的 ,你可以使用垃圾收集库,比如Boehm保守的垃圾收集器 ,但还有其他的: Ravenbrook的内存池系统 ,我的(未维护的) Qish GC , Matthew Plant的GC等等……

通常,您可以编写专门用于您的用例的垃圾收集器 。 您可以在C中使用问题中提到的技术(智能指针,引用计数),但您也可以实现标记和扫描GC或复制GC。

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

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

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

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

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

另请注意,通过静态源代码分析可靠地检测内存泄漏通常是不可能的( 不可判定的 ),因为它可以certificate等同于暂停问题 。

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

希望这可以帮助。 〜快乐的编码!