2011-03-24 89 views

回答

4

一般來說,這是依賴於實現的。

通常實現的方式是new/malloc將分配比您要求的更多的字節,並且會使用額外的字節來保存一些書籍:多次分配的塊也將保持鏈接狀態,列表,所以額外的字節將用於存儲下一個/ prev指針,以及塊的大小。

然而,這不是強制性的。新的/ malloc調用可以將指針和塊的大小存儲在地圖中。

如果您對特定實現感興趣,您將不得不提供更多信息(例如,您使用的是什麼運行時/編譯器?)。

1

運營商,以自己的特殊方式的malloc功能處理內存,所以

  • ,如果你與「新」使用「刪除」
  • 如果你分配的內存與分配的內存「的malloc 「使用‘免費’
  • ,如果你不知道如何/誰/在內存已分配,不釋放它

如果你一定要儘量亂用的malloc(這似乎是你的目標)的內部工作,你這樣做是錯誤的^^

0

有沒有一個正確的答案了問題因爲它取決於情況。在某些情況下,編譯器在編譯時知道對象的大小,因此刪除知道要釋放多少個字節。在編譯時不知道內存大小的情況下,可能涉及內存映射,或者如您自己所建議的那樣,指針之前的一個字指示分配的字節數。

我相信很多這是實現特定的,而不是您可以依賴的具體方法。這個問題與這個one非常相似。

+0

您確定「在某些情況下,編譯器知道編譯時對象的大小,因此刪除知道要釋放多少個字節」部分?我不認爲這是可能的,甚至如果這會要求系統二能夠以兩種不同的方式在堆上分配事物。 – Lindydancer 2011-03-24 07:17:06

+0

@Lindydancer - 好吧,當然是!這沒有什麼錯。例如sizeof關鍵字用於在編譯時確定對象的大小。並且編譯器根據分配或取消分配的類型生成不同的代碼並不是特別牽強。所有這些都是實現特定的。 – 2011-03-24 08:18:02

+0

@John - 我問的原因是因爲我一直在編寫C/C++編譯器超過10年,而我從未見過這個。由於需要一個特殊的'delete'操作符來獲取大小(而不是通過指針拾取它),編譯器必須能夠找到所有對'new'的調用以及對'delete'的相應調用。這個指針不能被正常的'delete'轉義並被刪除,這個特殊的刪除不能刪除一個正常的指針。你有一個這樣做的編譯器的具體例子嗎? – Lindydancer 2011-03-24 09:33:24