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

2021-08-18 11:54:02 字數 556 閱讀 9599

new出來的物件是直接放在堆上,而宣告乙個物件是放在棧中。換句話說,

new出來的物件的生命週期是全域性的,譬如在乙個函式塊裡

new乙個物件,可以將該物件的指標返回回去,該物件依舊存在。而宣告的物件的生命週期只存在於宣告了該物件的函式塊中,如果返回該宣告的物件,將會返回乙個已經被銷毀的物件。

可以看看**:

#include using namespace std;

class a

~a()

};a def()

a* nobject()

int main()

輸出結果:

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

C 建立物件new與不new區別

記憶體的分配方式有三種 1.從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。2.在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後在將這些區域性變數的記憶體空間 在棧上分配記憶體空間效率很...

C 用new與不用new建立物件的區別

c 建立物件一 alignment問題 重新發現這個問題是因為在體系結構課上提到的乙個概念,alignment對齊的概念。class myclass 像上面這個c 的類,它有兩個變數。myclass myclass cout sizeof myclass endl 或者直接算它的大小 cout si...

C new物件與直接宣告物件區別

剛開始使用基本資料型別的時候,相信大家都是直接像下面這樣直接宣告變數。int a double b 在學習了物件之後,發現可以用兩種方式宣告物件。class person intmain 那麼這兩種方式有什麼不同點呢?1.new出來的物件必須用指標接收,需要顯示的delete銷毀 2.記憶體位置不同...