C C 建立物件及注意事項

2021-08-10 16:00:28 字數 1028 閱讀 2911

c++的物件建立方式有3種,詳細見以下**所示。

#include using namespace std;

class test

~test() }

int main()

三種方式中,第一種和第二種分別為隱式呼叫和顯示呼叫,兩者都是在程序的虛擬位址空間的棧空間中分配記憶體。

第三種方式使用了關鍵字new,是在堆空間中分配記憶體。

注意: 棧空間中的記憶體分配和釋放是由系統管理,而堆空間中的記憶體分配和釋放是由程式自主釋放,因此堆空間的物件的new和delete需要配對使用,否則會導致記憶體洩露問題。因此,在使用new建立物件時有以下幾點注意事項:

1. new建立類物件需要指標接收,一處初始化,多處使用;

2. new建立類物件生命期結束後需顯示使用delete銷毀;

3. new建立物件直接使用堆空間,而區域性不用new定義類物件則使用棧空間;

4. new物件指標用途廣泛,比如作為函式返回值、函式引數等;

5. new / delete需要申請記憶體空間,因此頻繁呼叫物件的場合不適合使用new建立物件;

6. 棧空間大小遠小於堆空間大小;

7. 棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是c/c++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在 堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會 分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

附加:使用棧空間初始化物件失敗時,不可用try...catch...捕獲記憶體分配異常,而堆空間例項化出的物件可以使用try...catch...捕獲記憶體分配異常。

try

catch(const std::exception &e)

c c 注意事項

1,在使用變數前初始化他們。包括指標可初始化為null。2,返回棧裡的物件是危險的,尤其不能返回指標。char getbuff 是錯誤的。3,char型別的符號問題。4,不要依賴表示式的運算次序,一般編譯器都進行優化,先進行函式求值,再求複雜 表示式,再處理簡單資料。5,函式形參的求值是沒有次序的。...

C C 的注意事項

最近除錯c語言程式,出了一些錯誤,費了很大的力氣才找到這些bug。現在把這些錯誤記錄下來,同時做一些程式設計上的原則上的約束,希望能達到兩個目的 1 看到類似的情況,能馬上定位知道是什麼錯誤。2 不在犯這種錯誤。將64位整型轉換為32位整型,貌似是沒什麼問題。但是在做多結點間資料通訊的時候,這個不注...

MenuItem建立注意事項

01 前幾天在弄那個setvisible的時候,那個getchildbytag需要型別轉換,否則會報錯!於是不經意間,將menuitem項從menu中提出來,後來沒有報錯,但也隨之出現乙個問題就是menuitem不能響應事件。換句話說,它變成了乙個精靈,所以才可以呼叫setvisible方法。02 ...