我只是想知道什么可能导致更多的内存问题.例如,如果在堆栈上分配结构数组,或者如果要在堆上动态分配它.
通常,我遵循一个简单的规则.如果只在该函数中使用该结构,那么我在堆栈上进行分配.但是,如果我需要通过将其保存在内存中而在其他地方引用它,我会动态分配.
之所以我问这个问题,因为我的一些内存被破坏了,我被告知我应该动态分配而不是堆栈中的结构数组.堆栈内存有更多机会被破坏.但是,如果动态分配的内存损坏,您可以轻松释放它.
上述对任何人都有意义吗?
非常感谢任何建议,
解决方法 我不会说任何一种分配结构的方式都有“更多的腐败机会”.无论导致腐败的原因是什么,都可以轻松地发生,但是它被分配了.我会说你最好修复腐败的来源:你可以使用gdb通过watch< varname>写一个断点来写入损坏的变量.或者,您也可以在检测到损坏时设置断点,然后使用reverse debugging查找损坏发生的位置.
编辑:关于堆栈和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("%d\n",a);}
每次调用foo()时打印的数字都会增加1.通常,函数没有多个声明为static的变量,因为静态变量会记住上次调用函数时的最后一个值 – 这通常不是您想要的行为.这可能是告诉你静态变量“更有可能被破坏”的人的意思.
堆变量从创建时到有空()时都有效.这也称为动态分配,如果您计划将数据返回到程序的其他部分(或者如果要在C89中指定运行时数组的长度),则可以使用它.
旁白:静态是混淆的,当应用于全局范围中的函数名称或变量时:
static voID foo() { ... }static int x;
它表示“此功能或变量仅在此翻译单元内可见”.我不确定为什么static关键字有这两种不同的含义.
总结以上是内存溢出为你收集整理的堆栈分配的内存与动态分配的内存全部内容,希望文章能够帮你解决堆栈分配的内存与动态分配的内存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)