我对 C++ 很陌生,并试图尽可能多地理解堆栈和堆的概念(或者至少我需要知道的)。有些人倾向于说启动器不应该那么麻烦,但在我看来,内存泄漏或堆栈溢出很容易发生。我一直在阅读一些东西,但我仍然有点困惑,不确定我是否做对了。
这是我到目前为止所得到的......
1.堆:
堆是一个共享且动态分配的区域。我们流程的任何部分都可以通过正确的指针和内容(类型和长度)知识来访问它。如果我们尝试使用错误的指针(普通地址或释放指针)将导致分段错误。访问比分配的内容更大的内容也会导致分段错误(例如,尝试读取比分配的更大的数组)。必须“手动”释放未使用的区域以避免内存泄漏
2.堆栈:
堆栈是分配参数和局部变量的内存部分。堆栈的大小是有限的。堆栈作为 LIFO(后进先出)工作。
假设堆栈是一个预定义大小(堆栈大小)的箱。当我们定义局部变量时,它们被放入堆栈(放入 bin),并且一旦作用域发生变化(例如调用一个函数),我们的 bin 中就会使用一个盘片来防止访问先前作用域中定义的变量和一个新的局部变量范围被创建。一旦函数结束,所有局部变量都会被销毁,并且我们 bin 中的盘片被移除(返回到之前的作用域)。
例子 :
void MyFunction()
{
int *HeapArray = new int[10];
// HeapArray is assigned 40 bytes from the heap
// *HeapArray is assigned 4 bytes from the stack in a 32 bit environment
int StackArray1[10];
// StackArray is assigned 40 bytes from the stack
int StackArray2[20];
// StackArray is assigned 80 bytes from the stack
HeapArray = StackArray2;
// segmentation fault because StackArray it too large
delete HeapArray;
// this will deallocate the area assigned in the heap
// omitting delete would result in memory leaks
// the pointer itself *HeapArray continues to exist in the stack
HeapArray = StackArray1;
// segmentation fault because HeapArray is pointing to deallocated memory
MyFunction();
// this will result in a stack overflow
}
问题 :
Q1。定义一个对于堆栈来说太大的局部变量或者像我上面的示例那样具有无限递归函数会给我一个分段错误。为什么这不是说“堆栈溢出”?是因为堆栈“溢出到堆中”并造成分段错误吗?
Q2。假设我为堆栈提供的 bin 和 platters 示例:使用时extern
内容是复制到最后一个盘子顶部的新范围还是创建了某种指针?