2011-10-22 58 views
2

我有這樣的結構:如何分配長數組結構?

struct Heap { 
    int size; 
    int *heap_array; 
}; 

,我需要建立一個數組:

Heap *rooms = new Heap[k]; 

k可以是甚至等於1000000約1000它的工作原理對於k,其中k約10000我得到:

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 
Aborted 

編輯: 我忘了補充,我不能使用矢量,它的任務是在我校...只有<cstdio>的d <數學>允許。

+5

我不認爲在你的示例代碼中給出'new'關鍵字的標籤C在這裏沒什麼意義。 – Flexo

+1

你的結構很小,甚至1000000對現代計算機來說不應該是個問題。你是否爲每個'heap_array'指針分配額外的內存? – Blastfurnace

+0

我不知道你是否使用C64或者什麼,但是在ideone(內存相當有限)上,它的工作原理如下:https://ideone.com/eft8M – xanatos

回答

3

更新

你應該確保不會泄露任何東西,你堆分配不住長於需要。嘗試減少按Heap的分配要求。另外,如果您正在分配那麼多Heapsheap_array的存儲位置在哪裏?這些都是new[]嗎?

如果超過系統可尋址內存的數量,則可能需要將程序作爲64位可執行文件運行。

+2

我懷疑'size'也會被向量所過時。 –

+0

@ChrisLutz yup,我也發現了這一點,並在輸入時修改了我的帖子。 – justin

+0

我忘了補充,我不能使用矢量,它是我的學校的任務...只允許使用。 –

1

bad_alloc基本上意味着new無法分配請求的空間。令我驚訝的是,當您嘗試分配10000時,您已經看到它了。除此之外,您還使用了多少內存?

你可能想要檢查你的對齊方式是怎樣設置的(你如何做到這一點是編譯器特有的)使用向量不應該真的有助於避免bad_alloc異常,尤其是如果你從開始就知道需要的元素的數量。

你可能會在這裏運行你靠着牆頭,如果你想分配更多的內存比你有(2 GB在Win 32位),如果是這樣的情況下,嘗試尋找這個答案: C++ memory allocation: 'new' throws bad_alloc?

您也可能遇到碎片問題,可能有足夠的空間計算可用字節數,但是沒有足夠的空間存儲在單個集羣中。上面的鏈接爲用戶提供了一些建議以及用戶Crashworks他建議使用(儘管操作系統特定的)功能HeapAllocVirtualAlloc。但是,這又會與你的學校任務發生衝突。

請嘗試調查您是否在其他計算機上收到相同的問題。

也許如果確實需要分配和處理足夠的結構以導致異常,則可以考慮每次只處理少數幾個,最好重新使用已分配的結構。這會改善你的內存使用數量,甚至可能會更快。