2012-05-28 59 views
0

在調試堆我可以得到陣列,其通過new[]創建的尺寸:陣列的大小(新[])

int size = *((int *)((char *)ptr - 16)); 

它是否正常工作,如果該數組的大小小於28(但我不知道爲什麼?0_0)。

這個技巧是否在發佈模式下工作(不使用調試堆)?

我怎樣才能得到數組的大小(100%的工作和穩定)?

+0

爲什麼你需要獲得一個數組的大小? –

+2

您可以改用矢量。它的大小可以通過'std :: vector :: size()'來檢索。 – chris

+2

[你無法做到這一點可靠/普遍](http://stackoverflow.com/questions/2405722/why-cant-you-access-the-size-of-a-newd-array)。 – DCoder

回答

7

像這樣:

std::vector<int> array(1024); // allocate 1024 element array. 
int size = array.size(); 
int sizeInBytes = size * sizeof(int); 

;)

這真的是你正在嘗試做的最好的辦法是採取的一些東西,完全是編譯器/庫依賴adavantage ......它真的一般來說,因爲你的代碼變得完全不可移植,甚至沒有提到你的編譯器的下一個版本可能帶有不同的內存分配實現,這會破壞你正在嘗試做的事情......

+2

-1我知道這應該是他應該做的,但你肯定不知道,他不是這麼想的。另外,接收這樣的答案真的很令人沮喪。 – Pubby

+0

@Pubby:增加了一點額外的解釋爲什麼他試圖做的很糟糕... – Goz

+2

+1當OP詢問如何在腳下自己射擊時,「瞄準更好」不是最好的答案。沒有使用加載的槍,是。 –

10

你是依靠在一個impl上詳細說明。這就是您的特定實現如何存儲陣列所在的內存區域的大小。正如您已經看到的那樣,內存區域的大小可能比分配數組的大小要大。

如果您需要知道以new[]分配的數組的大小,則必須保持該值。

2

任何涉及從CRT中挖掘東西的方法都是未定義的,並且無法100%工作。
你唯一的方法就是重載operator new [],它將存儲定義的某個地方的大小,比如分配帶有大小前綴的大對象。

+1

'任何涉及從CRT挖掘東西的方法都是未定義的......它不是*未定義*,它是*未指定*。如果它是前者,那麼執行本身會有一段時間記錄它分配的內存。 – Praetorian

1

正如其他人所提到的,您正在使用實現細節來計算分配數組的大小。你已經設法弄清楚,如果你從由new[]返回的指針開頭返回16個字節,你可以得到數組的大小。

額外分配的16個字節看起來過多,如果您編譯應用程序的發行版本,這很可能不是這種情況。該實現可能會在請求的長度前後分配一些額外的字節,並使用魔術值填充該字節,以幫助捕獲代碼超出數組邊界。這個額外的空間可能不會在發佈版本中分配。

另外,你自己提到,如果數組的大小小於某個閾值,16字節的數字就不再有效了。如果你分配的對象比你現在分配的任何對象都多,你可能需要更進一步才能達到規模。

因此,提供給您的解決方案是:

  • 繼續使用new[]分配和使用std::vector::size
  • 保持一定的尺寸各地供以後使用
  • 使用std::vector並獲得大小如果知道的大小該陣列事先,並且不需要調整它,使用std::array。請注意,這個選項不會在堆上分配內存(除非你自己newstd::array本身)