我想这是一个非常基本的问题,但即使在网上浏览了一段时间后,我也无法找到这个问题的正确答案。 我将在堆栈/堆上参考本教程:http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html
我们说我写下面的代码:
void testVoid() {
int testVariable = 5;
}
如果我没错,这个函数应该创建一个位于堆栈上的变量。当函数退出时,堆栈中分配的内存将被删除 - 因此我的变量也应该被删除。
我已经知道c ++中的指针指向变量的内存位置。 因此,如果指针指向的变量位于堆栈上,然后堆栈被清除,我将不再能够通过指针访问原始值,因为指向的内存位置已被清除。但是,我测试了这个:
int* pointer;
void testVoid() {
int num = 3;
pointer = # // Here I get the memory location of my num-variable
cout << pointer << " : " << *pointer << endl; // I would get the same result if i printed &num
}
int main(int args, char** argv) {
pointer = new int;
testVoid();
cout << pointer << " : " << *pointer << endl; // I can still access the memory of my num-variable
while (true) {}
return 0;
}
退出testVoid() - 函数后,在创建变量的地方,我仍然可以使用指针获取变量的值。所以很明显我误解了指针如何在c ++中工作。即使在testVoid()完成之后,打印&amp;指针和&也为我提供了相同的内存位置。这是什么原因?如果指针指向的内存被移动到堆中,则不应该&lt;&lt;&amp; num和cout&lt;
以下是输出: 0024F904:3 0024F904:3
答案 0 :(得分:0)
仅仅因为该值超出范围并不意味着该值的内存已被覆盖。你不能依靠它在那时保持稳定。