迷途指针
有关 指针的争论备受瞩目。这是因为在程序中由于指针引发的错误可能是最难发现和最难解决的。在C++中导致难以发现和解决的错误的罪魁祸首是迷途(stray)指针。迷途指针也被称为失控(wild)指针或悬浮(dangling)指针,是将delete用于指针(从而释放它指向的内存),但没有将它设置为空时引发的。如果随后你在没有重新赋值的情况下使用该指针,后果将是不可预料的:程序崩溃算你走运。
就如同交通银行变更了号码,但你仍去按原来绑定的按钮。这可能不会导致什么严重后果——也许这将拨向一个无人仓库的电话,另一方面,也许这个号码已经被重新分配给了一个军工厂,你拨打电话可能引发爆炸,将整个城市摧毁。
总之,对指针delete后就不要再使用它。虽然这个指针仍然指向原来的内存区域 ,但编译器可能已经将其它数据存储在这里。不重新给这个指针赋值就再次使用它可能导致程序崩溃;更糟糕的是,程序可能表面上运行正常,但过不了几分钟就崩溃了。这被称为定时炸弹。为了安全起见,删除指针后,把其设置空(0),这样便解除了它的武装。
1 // Listing 8.9 - Demonstrates a stray pointer 2 //注意:两个指针可以指向同一块内存地址 3 4 typedef unsigned short int USHORT; 5 #include <iostream> 6 int main() 7 { 8 USHORT * pInt = new USHORT; 9 *pInt = 10; 10 std::cout << "*pInt: " << *pInt << '/t' 11 <<"pInt address: " << pInt << std::endl; 12 delete pInt; 13 14 long * pLong = new long; //pLong应该被分配到了原pInt指向的地址 15 *pLong = 90000; 16 std::cout << "*pLong: " << *pLong << '/t' 17 <<"pLong address: " << pLong << std::endl; 18 19 *pInt = 20; // uh oh, this was deleted! 20 21 std::cout << "*pInt: " << *pInt << '/t' << pInt << std::endl; 22 std::cout << "*pLong: " << *pLong << '/t' <<pLong <<std::endl; 23 delete pLong; 24 25 system("pause"); 26 return 0; 27 }