溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為何在調(diào)用delete[]時括號中不需要指明元素的個數(shù)

發(fā)布時間:2022-01-05 09:46:13 來源:億速云 閱讀:117 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)為何在調(diào)用delete[]時括號中不需要指明元素的個數(shù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

首先為沒看懂問題的同學進行簡單的知識準備。

在C++中有一條簡單的規(guī)則,調(diào)用new申請的內(nèi)存用delete釋放;調(diào)用new[]申請的內(nèi)存就一定要用delete[]釋放。

考慮有以下類定義。

public:
    Test(){};
    ~Test(){};
};

當我們要在堆中創(chuàng)建一個新對象時,可以用以下代碼:

    ?Test* pTest = new Test;

當我們要釋放這個對象時可以使用以下代碼:

    delete pTest;

當我們要在堆中創(chuàng)建10個對象是可以使用以下代碼:

    Test* pTests = new Test[10];

當我們要釋放這10個對象時,與new[]相呼應,必須使用delete[]。

    delete [] pTest;

兩者的區(qū)別在在于帶的new[]和delete[]會對每個元素調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。

以上是每個C++語法書都會降到的內(nèi)容。算是知識準備。

接下來十問題:為什么在調(diào)用delete[]時,括號中不需要指明元素的個數(shù)?

據(jù)說初期的C++在調(diào)用delete[]時是需要的指定元素個數(shù)的,但那樣的話就會非常麻煩。所以后來進行了改進,在實現(xiàn)new[]的時候同時申請內(nèi)存空間保存元素的個數(shù)?;旧鲜沁@個樣子:

struct array {
    size_t count_of_test;
   Test t[10];
};

在調(diào)用new[]時先通過malloc()申請內(nèi)存時多申請一點空間保存count_of_test,然后是返回給用戶t空間的地址。這個地址要在malloc獲得的array地址上加一個偏移量。最后對這個t空間調(diào)用每個元素的構(gòu)造函數(shù)。

調(diào)用delete[]的參數(shù)實際上是t空間的地址。先對這個地址參數(shù)進行減偏移量運算得到array地址并取得count_of_test,然后對t空間調(diào)用析構(gòu)函數(shù)count_of_test次。最后以array地址作為參數(shù)調(diào)用free()函數(shù)。

除了正確調(diào)用構(gòu)造函數(shù)/析構(gòu)函數(shù)以外,還要處理保存元素個數(shù)的空間。

所以必須配對使用。

上述就是小編為大家分享的為何在調(diào)用delete[]時括號中不需要指明元素的個數(shù)了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI