1. 程式人生 > >C++中宣告物件與new物件的區別

C++中宣告物件與new物件的區別

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();
}
輸出結果:可以看到,通過宣告的物件在函式返回時就已經被銷燬了,雖然呼叫它的成員函式成功執行了操作,但這個操作是十分不安全的。因為該物件所在的記憶體其實已經被控制器認為是廢棄了的,成功呼叫只是因為這塊記憶體還沒有被其他指令覆蓋掉。而如果已經被覆蓋掉後,再進行呼叫就會產生意想不到的結果。