C++中宣告物件與new物件的區別
阿新 • • 發佈:2018-12-23
new出來的物件是直接放在堆上,而宣告一個物件是放在棧中。換句話說,new出來的物件的生命週期是全域性的,譬如在一個函式塊裡new一個物件,可以將該物件的指標返回回去,該物件依舊存在。而宣告的物件的生命週期只存在於聲明瞭該物件的函式塊中,如果返回該宣告的物件,將會返回一個已經被銷燬的物件。可以看看程式碼:
可以看到,通過宣告的物件在函式返回時就已經被銷燬了,雖然呼叫它的成員函式成功執行了操作,但這個操作是十分不安全的。因為該物件所在的記憶體其實已經被控制器認為是廢棄了的,成功呼叫只是因為這塊記憶體還沒有被其他指令覆蓋掉。而如果已經被覆蓋掉後,再進行呼叫就會產生意想不到的結果。
輸出結果:#include <iostream> using namespace std; class A { public: void pp() { cout << "ddd" << endl; } ~A(){ cout << "destroy A" << endl; } }; A def() { A a; return a; } A* nobject() { A* a = new A(); return a; } int main() { A a1 = def(); a1.pp(); A* a2 = nobject(); a2->pp(); }