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

时间:2011-01-29 11:05:54

标签: c stack heap-memory

我最近一直在使用c并且发现我真的不喜欢处理内存管理,或者至少我认为如果我指向一个指针我必须释放它,即使它是最微不足道的东西。这导致我尽可能地在堆栈上分配并使用&得到它的位置。甚至制作单独的int和inptr变量(我的宏中有&运算符的左值问题)。

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

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

4 个答案:

答案 0 :(得分:7)

如果符合以下条件,您应该使用malloc

  1. 您正在向调用堆栈中的非static const数据传递指针,或
  2. 您正在分配变量或只是大量数据(否则您会冒着堆栈溢出的风险)。
  3. 在其他情况下,堆栈分配应该没问题。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

您可能需要查看“Boehm C Garbage Collector”。这是一个经过时间考验的软件,我已经多次使用它没有任何问题。这样,您就可以有效地使用malloc来解决所有问题,只需忘记相应的free

答案 3 :(得分:0)

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