C最佳实践,堆栈与堆分配

我最近一直在使用ca,并发现我真的不喜欢处理内存管理,或者至少我认为如果我malloc指针我必须释放它,即使它是最琐碎的事情。 这导致我尽可能多地在堆栈上分配并使用&来获取它的位置。 甚至制作单独的int和inptr变量(我在宏中使用&运算符时出现了一些左值问题)。

我没有找到很多地方我必须处理分配它的数据(上/下)。 与此同时,我需要相当数量的早期回报(而且我宁愿避免使用)。 一般的c意见是什么? 在特定情况下我是否应该使用其中一个或另一个明显的迹象。

PS让我有点担心的一件事是,我最近因为使用了错误的sizeof for malloc而出现了内存损坏问题而且我没有立即注意到它,因为我的大部分代码路径直接在那之后没有使用堆。 你认为这种腐败隐藏的问题有多大?

你应该使用malloc

  1. 您正在向调用堆栈传递指向非static const数据的指针,或者
  2. 你正在分配变量或只是大量的数据(否则你冒着堆栈溢出的风险)。

在其他情况下,堆栈分配应该没问题。

有点舌头的脸:最可靠的标志是当你用完堆栈时。

除了拉马斯提到的另一种情况是,当你想要将数据返回给调用者时,在大多数情况下,当返回的数据很复杂时,返回指针比返回副本更有效。

虽然技术上与OP的问题没有直接关系,但它在同一个球场(我认为这是我答案的充分理由)。

您可能想看看“ Boehm C垃圾收集器 ”。 这是经过时间考验的软件,我已经多次使用它没有任何问题。 这可以让你有效地使用malloc来解决所有问题而忘记相应的free

当您必须处理少量数据并且仅在一个函数中需要此数据时,堆栈分配非常有用。 如果你必须在函数之间传递指针,你最好malloc()堆上的内存,因为一旦你退出函数,它的堆栈可能每次都被覆盖。 拥有超过127个字节的本地数据会降低执行速度,因为如果偏移量在此限制范围内,它可以包含在指令本身中(例如mov eax, [ebp - 4] ),因此应该在堆上分配字符缓冲区(如果您不确定它们是否不会超过此限制)。 关于free()的另一件事(成本被低估;):释放你的记忆不是必需的,如果事实上os会回复它给你的应用程序的所有内存,但这是糟糕的编程习惯,懒惰的迹象和可能导致内存泄漏或任何类型的错误。