1:当指针所指向的内存被销毁时,该区域不可复用。若有指针指向该区域,则需要将该指针置为空值(NULL)或者指向未被销毁的内存。
内存销毁实质上是系统判定该内存不是变成人员正常使用的空间,系统也回将它们分配给别的任务。若擅自使用被销毁内存的指针更改该内存的数据,很可能会造成意向不到的后果。
代码实例如下:
// 5.13.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using std::cout; using std::endl; int* sum(int a, int b) { int* pS = NULL; int c = a + b; pS = &c; return pS; } int main() { int* pI = NULL; //将指针初始化为空 int k1 = 3; int k2 = 5; pI = sum(k1, k2); cout << "*pI的值:" << *pI << endl; cout << "也许*pI还保留着i值,但它已经被程序认定为销毁" << endl; cout << "*pI的值:" << *pI << endl; cout << "尝试修改*pI" << endl; *pI = 3; for (int i = 0; i<3; i++) { cout << "修改被销毁的内存后*pI的值:" << *pI << endl; } }
运行结果:
2:从上面的程序可以看出,指针pI从sum函数中得到一个临时指针,该指针是指针pS的临时复制品,操作完成后就消失,而它所保留的地址交给了pI。在sum执行完毕后,该域使用的栈内存会被系统销毁或挪用。本程序尝试使用pI继续使用修改它,结果是系统会在此销毁它。在某些场合下,该程序也许会引起内存报错,甚至会造成多个程序崩溃。所以对于栈内存的指针一定要明白其何时被销毁,不在重复利用它。