1. 程式人生 > >C++ 建立物件的三種方式

C++ 建立物件的三種方式

第一種和第二種沒什麼區別,一個隱式呼叫,一個顯式呼叫,兩者都是在程序虛擬地址空間中的棧中分配記憶體,而第三種使用了new,在堆中分配了記憶體,而棧中記憶體的分配和釋放是由系統管理,而堆中記憶體的分配和釋放必須由程式設計師手動釋放。採用第三種方式時,必須注意一下幾點問題:

  1. new建立類物件需要指標接收,一處初始化,多處使用
  2. new建立類物件使用完需delete銷燬
  3. new建立物件直接使用堆空間,而區域性不用new定義類物件則使用棧空間
  4. new物件指標用途廣泛,比如作為函式返回值、函式引數等
  5. 頻繁呼叫場合並不適合new,就像new申請和釋放記憶體一樣
  6. 棧的大小遠小於堆的大
  7. 棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在 堆記憶體中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會 分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多
#include <iostream> 
using namespace std; 
class A 
{ 
private: 
    int n; 
public: 
    A(int m):n(m) 
    { } 
    ~A(){} 
}; 
int main() 
{ 
    A a(1);  //棧中分配 
    A b = A(1);  //棧中分配 
    A* c = new A(1);  //堆中分配 
  delete c; 
    return 0; 
}