C++——建立類的時候用new與不用new 的區別(轉)

C++在建立對象的時候能夠採用兩種方式:(例如類名爲Test) Test test  或者 Test* pTest = new Test()。
        這兩種方法均可以實例化一個對象,可是這兩種方法有很大的區別,區別在於對象內容所在的內存空間不一樣,衆所周知,內存的分配方式有三種
      (1)從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。 
      (2)  在棧上建立。在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束後在將這些局部變量的內存空間回收。在棧上分配內存空間效率很高,可是分配的內存容量有限。
       (3) 從堆上分配的。程序在運行的時候用 malloc 或 new 申請任意多少的內存,程序員本身負責在什麼時候用 free 或 delete 釋放內存。ios

        那麼當使用Test test給對象分配內存空間的時候,是分配在堆中的仍是棧中的呢?實踐是檢驗真理的惟一標準,以程序爲證:程序員

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class TestNew  
  5. {  
  6. private:  
  7.     int ID;  
  8. public:  
  9.     TestNew(int ID);  
  10.     ~TestNew();  
  11. };  
  12.   
  13. TestNew::TestNew(int ID)  
  14. {  
  15.     this->ID = ID;  
  16. }  
  17.   
  18. TestNew::~TestNew()  
  19. {  
  20.     std::cout<<"對象 "<<this->ID<<" 執行析構函數"<<std::endl;  
  21. }  
  22. void Test()  
  23. {  
  24.     TestNew test(1);//建立對象1,不使用new  
  25.     TestNew *pTest = new TestNew(1);//建立對象2,使用new  
  26. }  
  27.   
  28. int main()  
  29. {  
  30.     Test();//這個地方有點問題,pTest沒有進行處理,會致使內存泄露,實際應用中要注意呀  
  31. }  

從運行結果中,咱們能夠得出在不使用new建立對象時,對象的內存空間是在棧中的,其做用範圍只是在函數內部,函數執行完成後就會調用析構函數,刪除該對象。函數

使用new建立對象是建立在堆中的,必需要程序員手動的去管理該對象的內存空間。
 學習

平時不多寫東西,導師建議平時要多讀一些技術博客,本身也要寫一些學習心得,初次嘗試(水平比較低),有些東西表達不清楚或者有問題……還望各位批評指教,不勝感激。this

相關文章
相關標籤/搜索