让我们看一个示例,您可能可以访问超出其范围的局部变量的内存。
#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }
输出结果
这可能会给出输出-
3 12
如前 ,此代码可以正常工作。我们只是在读取和写入内存,将USED用作x的地址。总的来说,您超出了foo的范围,该地址是指向某个随机内存区域的指针。在上面的示例中,该内存区域确实存在,并且此刻没有其他任何东西在使用它。您不会通过继续使用而破坏任何内容(不会使用另一个进程的存储区或任何其他未授权的存储区),并且还没有其他东西覆盖它。因此,3仍然存在。
在真实的程序中,该内存可能几乎立即被重用,并且您可能会通过诸如此类的操作破坏某些内容。这样的内存访问错误很难跟踪和消除。
当您从foo返回时,程序会告诉OS X的内存已不再使用,可以将其重新分配给其他对象。如果您很幸运并且重新分配了它,并且操作系统没有再吸引您使用它,那么您就可以摆脱它。