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

來源:互聯網
上載者:User

標籤:blog   new   pos   自己   delete   gif   oid   實踐   stat   

轉自:https://www.cnblogs.com/tony-li/p/4111588.html

C++在建立對象的時候可以採用兩種方式:(例如類名為Test) Test test  或者 Test* pTest = new Test()。

        這兩種方法都可以執行個體化一個對象,但是這兩種方法有很大的區別,區別在於對象內容所在的記憶體空間不同,眾所周知,記憶體的分配方式有三種      

(1)從靜態儲存地區分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個運行期間都存在。例如全域變數,static 變數。       

(2)  在棧上建立。在執行函數時,函數內局部變數的儲存單元都可以在棧上建立,函數執行結束後在將這些局部變數的記憶體空間回收。在棧上分配記憶體空間效率很高,但是分配的記憶體容量有限。  

(3) 從堆上分配的。程式在啟動並執行時候用 malloc 或 new 申請任意多少的記憶體,程式員自己負責在何時用 free 或 delete 釋放記憶體。

        那麼當使用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建立對象是建立在堆中的,必須要程式員手動的去管理該對象的記憶體空間。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.