C C 記憶體知識 四

2022-03-13 00:13:42 字數 1050 閱讀 6817

c/c++記憶體知識(四)

有了malloc/free

為什麼還要

new/delete

?malloc

與free

是c++/c

語言的標準庫函式,

new/delete

是c++

的運算子。它們都可用於申請動態記憶體和釋放記憶體。

對於非內部資料型別的物件而言,

光用maloc/free

無法滿足動態物件的要求

。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。

由於malloc/free

是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於

malloc/free。因此

c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子

new,以及乙個能完成清理與釋放記憶體工作的運算子

delete。注意

new/delete

不是庫函式。

我們先看一看

malloc/free

和new/delete

如何實現物件的動態記憶體管理:

class obj

~obj(void)

void initialize(void)

void destroy(void)

};void usemallocfree(void)

void usenewdelete(void)

既然new/delete 的功能完全覆蓋了malloc/free,為什麼c++不把malloc/free 淘汰出局呢?

這是因為c++程式經常要呼叫c 函式,而c 程式只能用malloc/free 管理動態記憶體。

如果用free 釋放「new 建立的動態物件」,那麼該物件因無法執行析構函式而可能導致程式出錯。

如果用delete 釋放「malloc 申請的動態記憶體」,理論上講程式不會出錯,但是該程式的可讀性很差。所以new/delete 必須配對使用,malloc/free 也一樣。

C C 記憶體知識 一

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 二 例子程式 這是乙個前輩寫的,非常詳細 int a 0 全域性初始化區 char p1 全域性未初始化區 main int b 棧 char s abc 棧 char p2 棧 char p3 123456 123456 0在常量區,p3在棧上...

C C 記憶體知識 二

c c 記憶體知識 二 計算記憶體容量 用運算子sizeof 可以計算出陣列的容量 位元組數 int a 3 sizeof a 的值是12 注意別忘了 0 p是指標,指向a,但是sizeof p 的值卻是4。這是因為sizeof p 得到的是乙個指標變數的位元組數,相當於sizeof char 而不...

C C 記憶體知識 一

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 二 例子程式 這是乙個前輩寫的,非常詳細 int a 0 全域性初始化區 char p1 全域性未初始化區 main int b 棧 char s abc 棧 char p2 棧 char p3 123456 123456 0在常量區,p3在棧上...