堆栈分配的内存与动态分配的内存
gcc 4.6.2 c89
我只是想知道什么可能导致更多的内存问题。 例如,如果您在堆栈中分配结构数组,或者如果您要在堆上动态分配它。
通常,我遵循一个简单的规则。 如果该结构仅用于该函数,那么我将在堆栈上分配。 但是,如果我需要通过将其保存在内存中来将其引用到其他位置,我将动态分配。
之所以我问这个问题是因为我的一些内存被损坏了,而且我被告知应该动态分配而不是在堆栈中为结构数组分配。 由于堆栈内存更容易被损坏。 但是,如果动态分配的内存被损坏,则可以轻松释放它。
以上是否对任何人都有意义?
非常感谢您的任何建议,
我不会说任何一种分配结构的方式都有“更多的腐败机会”。 无论是什么原因导致腐败可能会很容易发生,然而它被分配。
我会说你会更好的修复损坏的源代码:你可以使用gdb将一个断点写入损坏的变量中,并使用watch <varname>
。 或者,您也可以在检测到损坏时放置断点,然后使用反向调试来查找损坏发生的位置。
编辑:似乎有一些关于堆栈和static
分配的含义的混淆:
void foo() {
int a[10]; // stack
static int b[10]; // static
int *c = malloc(sizeof(int) * 10); // dynamic on the heap
}
堆栈变量仅在函数的寿命是有效的-一旦此功能又回来了,你不能在的位置所需的数据a
仍然有效。 有时这些被称为本地或自动变量。
函数内的静态变量在函数外也是有效的 - 数据保存在函数调用之间。 这意味着如果你这样做:
void foo() {
static int a = 0;
a++;
printf("%dn",a);
}
每次调用foo()
时,打印的数字都会加1。 一般来说,函数没有多个被声明为静态的变量,因为静态变量记住了上一次函数被调用时的最后一个值 - 通常这不是您想要的行为。 这可能就是这个人告诉你静态变量“更容易被破坏”的含义。
堆变量从创建时到free()
时有效free()
d。 这也称为动态分配,如果您计划将数据返回到程序的另一部分(或者如果您想在C89的运行时指定一个数组的长度),那么这也称为动态分配。
除此之外: static
应用于全局作用域中的函数名称或变量时会引起混淆:
static void foo() { ... }
static int x;
意思是“这个函数或变量只在这个翻译单元中可见”。 我不知道为什么static
关键字有这两个不同的含义。
通常,不要静态地分配,而应该在数据结构是函数本地时在堆栈上分配。 这使得创建可重入函数和避免各种问题变得更加容易。
(作为一个例外,静态分配const
数据不成问题。)
编辑 :好吧,你的意思是堆栈分配。 在这种情况下,你遵循的规则是健全的做法。 但堆栈和堆分配都不能防止内存损坏。
如果你担心内存损坏,你应该担心动态分配和静态分配。 如果你有腐败,差异只是会被破坏,但结果是不好的。
如果你担心泄漏,那么静态分配会让生活变得简单 - 你不需要释放它,所以它不会泄漏。
但我认为主要的标准应该是静态分配是否让你分配太多。
通过动态分配,您可以根据自己的实际需求来确定分配的大小,而在静态分配的情况下,您可能会迫使分配更多,达到某个理论最大值。 例如,如果您想要每个客户端的结构,并且最多支持1000个客户端,则必须提前分配1000个结构,即使实际上只有3个客户端也是如此。 通过动态分配,您可以在需要时分配所需的内容。
上一篇: stack allocated memory versus dynamically allocated memory
下一篇: How to allocate aligned memory only using the standard library?