1. 程式人生 > >C++——創建類的時候用new與不用new 的區別

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

delet 註意 我們 兩種 多少 內存泄露 start 配方 sdn

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

技術分享圖片

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

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

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