C++之建立物件時的new與不new
阿新 • • 發佈:2018-12-23
C++在建立物件的時候可以採用兩種方式:(例如類名為Test) Test test 或者 Test* pTest = new Test()。
這兩種方法都可以例項化一個物件,但是這兩種方法有很大的區別,區別在於物件內容所在的記憶體空間不同,眾所周知,記憶體的分配方式有三種
(1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static 變數。
(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後在將這些區域性變數的記憶體空間回收。在棧上分配記憶體空間效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配的。程式在執行的時候用 malloc 或 new 申請任意多少的記憶體,程式設計師自己負責在何時用 free 或 delete 釋放記憶體。
這兩種方法都可以例項化一個物件,但是這兩種方法有很大的區別,區別在於物件內容所在的記憶體空間不同,眾所周知,記憶體的分配方式有三種
(1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static 變數。
(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束後在將這些區域性變數的記憶體空間回收。在棧上分配記憶體空間效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配的。程式在執行的時候用 malloc 或 new 申請任意多少的記憶體,程式設計師自己負責在何時用 free 或 delete 釋放記憶體。
那麼當使用Test test給物件分配記憶體空間的時候,是分配在堆中的還是棧中的呢?實踐是檢驗真理的唯一標準,以程式為證:
#include <iostream> using namespace std; class TestNew { private: int ID; public: TestNew(int ID); ~TestNew(); }; TestNew::TestNew(int ID) { this->ID = ID; } TestNew::~TestNew() { std::cout<<"物件 "<<this->ID<<" 執行解構函式"<<std::endl; } void Test() { TestNew test(1);//建立物件1,不使用new TestNew *pTest = new TestNew(1);//建立物件2,使用new } int main() { Test();//這個地方有點問題,pTest沒有進行處理,會導致記憶體洩露,實際應用中要注意呀 }
從執行結果中,我們可以得出在不使用new建立物件時,物件的記憶體空間是在棧中的,其作用範圍只是在函式內部,函式執行完成後就會呼叫解構函式,刪除該物件。
而使用new建立物件是建立在堆中的,必須要程式設計師手動的去管理該物件的記憶體空間。
平時很少寫東西,導師建議平時要多讀一些技術部落格,自己也要寫一些學習心得,初次嘗試(水平比較低),有些東西表達不清楚或者有問題……還望各位批評指教,不勝感激。