了解動態記憶體在 c++ 中是如何工作的是成為一名合格的 c++ 程式設計師必不可少的。c++ 程式中的記憶體分為兩個部分:
很多時候,您無法提前預知需要多少記憶體來儲存某個定義變數中的特定資訊,所需記憶體的大小需要在執行時才能確定。
在 c++ 中,您可以使用特殊的運算子為給定型別的變數在執行時分配堆內的記憶體,這會返回所分配的空間位址。這種運算子即new運算子。
如果您不需要動態分配記憶體,可以使用delete運算子,刪除之前由 new 運算子分配的記憶體。
下面是使用 new 運算子來為任意的資料型別動態分配記憶體的通用語法:
new在這裡,data-type可以是包括陣列在內的任意內建的資料型別,也可以是包括類或結構在內的使用者自定義的任何資料型別。讓我們先來看下內建的資料型別。例如,我們可以定義乙個指向 double 型別的指標,然後請求記憶體,該內存在執行時被分配。我們可以按照下面的語句使用new運算子來完成這點:data
-type
;
double如果自由儲存區已被用完,可能無法成功分配記憶體。所以建議檢查 new 運算子是否返回 null 指標,並採取以下適當的操作:*pvalue
=null
;// 初始化為 null 的指標
pvalue
=new
double
;// 為變數請求記憶體
doublemalloc()函式在 c 語言中就出現了,在 c++ 中仍然存在,但建議盡量不要使用 malloc() 函式。new 與 malloc() 函式相比,其主要的優點是,new 不只是分配了記憶體,它還建立了物件。*pvalue
=null;if
(!(pvalue
=new
double
))
在任何時候,當您覺得某個已經動態分配記憶體的變數不再需要使用時,您可以使用 delete 操作符釋放它所占用的記憶體,如下所示:
delete下面的例項中使用了上面的概念,演示了如何使用 new 和 delete 運算子:pvalue
;// 釋放 pvalue 所指向的記憶體
#include當上面的**被編譯和執行時,它會產生下列結果:using
namespace
std;
intmain
()
value假設我們要為乙個字元陣列(乙個有 20 個字元的字串)分配記憶體,我們可以使用上面例項中的語法來為陣列動態地分配記憶體,如下所示:of pvalue
:29495
char要刪除我們剛才建立的陣列,語句如下:*pvalue
=null
;// 初始化為 null 的指標
pvalue
=new
char[20
];// 為變數請求記憶體
delete下面是 new 操作符的通用語法,可以為多維陣列分配記憶體,如下所示:pvalue
;// 刪除 pvalue 所指向的陣列
double釋放多維陣列記憶體的語法與二維陣列一樣:**pvalue
=null
;// 初始化為 null 的指標
pvalue
=new
double[3
][4];// 為乙個 3x4 陣列分配記憶體
delete物件與簡單的資料型別沒有什麼不同。例如,請看下面的**,我們將使用乙個物件陣列來理清這一概念:pvalue
;// 刪除 pvalue 所指向的陣列
#include如果要為乙個包含四個 box 物件的陣列分配記憶體,建構函式將被呼叫 4 次,同樣地,當刪除這些物件時,析構函式也將被呼叫相同的次數(4次)。using
namespace
std;
class
box~
box()
};int
main()
當上面的**被編譯和執行時,它會產生下列結果:
呼叫建構函式!呼叫建構函式!
呼叫建構函式!
呼叫建構函式!
呼叫析構函式!
呼叫析構函式!
呼叫析構函式!
呼叫析構函式!
C 動態記憶體
棧 在函式內部宣告的所有變數都將占用棧記憶體 堆 這是程式中未使用的記憶體,在程式執行時可用於動態分配記憶體 new和delet運算子 動態分配記憶體的通用語法 new data type 如果自由儲存區已被用完,可能無法成功分配記憶體。所以建議檢查 new 運算子是否返回 null 指標,並採取以...
C 動態記憶體
到目前為止,我們的程式中我們只用了宣告變數 陣列和其他物件 objects 所必需的記憶體空間,這些記憶體空間的大小都在程式執行之前就已經確定了。但如果我們需要記憶體大小為乙個變數,其數值只有在程式執行時 runtime 才能確定,例如有些情況下我們需要根據使用者輸入來決定必需的記憶體空間,那麼我們...
C 動態記憶體
new 的功能是在堆區新建乙個物件,並返回該物件的指標。所謂的 新建物件 的意思就是,將呼叫該類的建構函式,因為如果不構造的話,就不能稱之為乙個物件。而 malloc 只是機械的分配一塊記憶體,如果用 mallco 在堆區建立乙個物件的話,是不會呼叫建構函式的。同樣的,用 delete 去釋放乙個堆...