中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

為何在調用delete[]時括號中不需要指明元素的個數

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

這期內容當中小編將會給大家帶來有關為何在調用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[]時括號中不需要指明元素的個數了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

吴川市| 合山市| 浪卡子县| 华容县| 乐清市| 泽州县| 大城县| 成都市| 安义县| 白沙| 桓台县| 板桥市| 禹州市| 宁国市| 哈密市| 伊春市| 文登市| 西和县| 高雄县| 准格尔旗| 西丰县| 如东县| 信阳市| 明光市| 郓城县| 友谊县| 阳曲县| 鹤庆县| 博白县| 涡阳县| 化德县| 旬阳县| 沅陵县| 乐亭县| 望城县| 曲沃县| 普宁市| 车致| 盐城市| 自治县| 通海县|