您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關為何在調用delete[]時括號中不需要指明元素的個數,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
首先為沒看懂問題的同學進行簡單的知識準備。
在C++中有一條簡單的規則,調用new申請的內存用delete釋放;調用new[]申請的內存就一定要用delete[]釋放。
考慮有以下類定義。
public:
Test(){};
~Test(){};
};
當我們要在堆中創建一個新對象時,可以用以下代碼:
?Test* pTest = new Test;
當我們要釋放這個對象時可以使用以下代碼:
delete pTest;
當我們要在堆中創建10個對象是可以使用以下代碼:
Test* pTests = new Test[10];
當我們要釋放這10個對象時,與new[]相呼應,必須使用delete[]。
delete [] pTest;
兩者的區別在在于帶的new[]和delete[]會對每個元素調用構造函數和析構函數。
以上是每個C++語法書都會降到的內容。算是知識準備。
接下來十問題:為什么在調用delete[]時,括號中不需要指明元素的個數?
據說初期的C++在調用delete[]時是需要的指定元素個數的,但那樣的話就會非常麻煩。所以后來進行了改進,在實現new[]的時候同時申請內存空間保存元素的個數。基本上是這個樣子:
struct array {
size_t count_of_test;
Test t[10];
};
在調用new[]時先通過malloc()申請內存時多申請一點空間保存count_of_test,然后是返回給用戶t空間的地址。這個地址要在malloc獲得的array地址上加一個偏移量。最后對這個t空間調用每個元素的構造函數。
調用delete[]的參數實際上是t空間的地址。先對這個地址參數進行減偏移量運算得到array地址并取得count_of_test,然后對t空間調用析構函數count_of_test次。最后以array地址作為參數調用free()函數。
除了正確調用構造函數/析構函數以外,還要處理保存元素個數的空間。
所以必須配對使用。
上述就是小編為大家分享的為何在調用delete[]時括號中不需要指明元素的個數了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。