今天下午試著用了一下static變量,結果發現自己平時在使用delete時的好多錯誤。就因為我把 delete [] pointer 寫成 delete pointer [],讓我調試了將近二十分鐘。 先看一下我當時寫掉static的代碼,當然重點不是static。 [html] #include<iostream> using namespace std; class Test { public: Test() { cout<<number<<"++++++++++"<<endl; number++; } ~Test() { cout<<number<<"----------"<<endl; number--; } int getNumber() { return number; } private: static int number; //屬於這個類而非單個的對象 }; int Test::number = 0; //靜態成員在使用前必須初始化 int main() { Test* pointer=new Test[3]; cout<<pointer->getNumber()<<endl; delete [] pointer; return 0; } #include<iostream> using namespace std; class Test { public: Test() { cout<<number<<"++++++++++"<<endl; number++; } ~Test() { cout<<number<<"----------"<<endl; number--; } int getNumber() { return number; } private: static int number; //屬於這個類而非單個的對象 }; int Test::number = 0; //靜態成員在使用前必須初始化 int main() { Test* pointer=new Test[3]; cout<<pointer->getNumber()<<endl; delete [] pointer; return 0; }運行結果: [cpp] 1++++++++++ //執行Test() 2++++++++++ 3++++++++++ 3 pointer->getNumber(); 3---------- // ~執行Test() 2---------- 1---------- 1++++++++++ //執行Test() 2++++++++++ 3++++++++++ 3 pointer->getNumber(); 3---------- // ~執行Test() 2---------- 1---------- new Test[3]生成了三個對象,即執行了三次Test(),所以number++執行了三次,即為3. 在銷毀用new開的數組的時候必須在delete之後添加[ ].否則會造成內存洩漏。將上述代碼中的delete [] pointer 換成delete pointer之後的運行結果如下: [html] 1++++++++++ //執行Test() 2++++++++++ 3++++++++++ 3 pointer->getNumber(); 3---------- // ~執行Test() 1++++++++++ //執行Test() 2++++++++++ 3++++++++++ 3 pointer->getNumber(); 3---------- // ~執行Test()在銷毀動態數組的時候,如果在delete之後木有[],析構函數就只執行一次。所以在銷毀動態數組掉時候一定要記得加[]. 通常在我們銷毀了pointer之後就應該將pointer置NULL,否則pointer將會成為野指針。 在使用delete pointer 的時候只是將pointer所指掉變量清除,並不是將指針變量本身清除,所以在delete前後,pointer本身掉值是不變的,看下面的代碼: [html] class Test { }; int main() { Test* pointer=new Test[3]; cout<<"在delete之前pointer的值 "<<pointer<<endl; delete pointer ; cout<<"在delete之後pointer的值 "<<pointer<<endl; pointer=NULL; cout<<"pointer置空後的值 "<<pointer<<endl; return 0; } class Test { }; int main() { Test* pointer=new Test[3]; cout<<"在delete之前pointer的值 "<<pointer<<endl; delete pointer ; cout<<"在delete之後pointer的值 "<<pointer<<endl; pointer=NULL; cout<<"pointer置空後的值 "<<pointer<<endl; return 0; }運行結果: [cpp] 在delete之前pointer的值為 0x8963008 在delete之後pointer的值為 0x8963008 pointer置空後的值為 0 在delete之前pointer的值為 0x8963008 在delete之後pointer的值為 0x8963008 pointer置空後的值為 0所以在將pointer delete之後一定要記得pointer=NULL,否則pointer就會成為野指針....這個危害就不說了.......