簡體   English   中英

動態分配數組的大小

[英]size of dynamically allocated array

分配給動態分配的數組的起始地址的指針是否不具有數組大小的信息? 所以我們必須使用另一個變量來存儲它的大小,以便稍后通過指針處理數組。

但是當我們釋放動態分配的數組時,我們不指定大小,而只是“free ptr”或“delete [] ptr”。 如何釋放或刪除知道數組的大小? 我們可以使用相同的方案來避免將數組的大小存儲在另一個變量中嗎?

謝謝!

是的,這是真的。

delete知道內存塊的大小,因為new會向塊添加額外信息(通常在返回給用戶的區域之前),包含其大小以及其他信息。 請注意,這些都是特定於實現的,不應該由您的代碼使用。

所以回答你的最后一個問題: - 我們不能使用它 - 它是一個高度平台和編譯器相關的實現細節。


例如,在K&R2中演示的示例內存分配器中,這是放置在每個已分配塊之前的“標頭”:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size是已分配塊的大小(然后由freedelete )。

有趣的是,從歷史上看它是delete [20] arr; 就像它是arr = new int[20] 然而,實踐證明,分配器可以無痛地存儲大小信息,並且由於大多數人使用它然后無論如何都存儲它,它被添加到標准中。

更有趣,也鮮為人知的是,這種“擴展刪除語法”實際上是由少數C ++編譯器支持的(盡管即使面對C ++ 98標准也是如此),盡管沒有人需要它。

int* arr = new int[20];
delete [20] arr;

然而,關於這一切的可悲部分是,沒有符合標准的方法來檢索通過尺寸供您自己使用: - /

確實,數組不包含數組的大小,您必須存儲該信息以供日后使用。 通過deletefree刪除數組時,它是指向您傳遞的已分配內存的指針。 使用的內存管理器(由系統或您自己的自定義覆蓋new和delete)知道釋放的內存區域,並跟蹤它。 希望它有意義。

對,是真的。 這是為什么你應該很少直接嘗試處理這個問題的一部分,而是使用標准容器。 關於處理它的唯一時間是你自己決定實現容器(在這種情況下,你通常會跟蹤容器實現中的大小信息)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM