我遇到了一個問題,我在堆棧上使用了太多的內存。我正在使用幾個大型數組,我只需要在代碼中的步驟之間。基本上我需要知道如何釋放由的AS創建一個數組變量所使用的內存:刪除,釋放或取消分配?
float arrayName[length][width];
我遇到了一個問題,我在堆棧上使用了太多的內存。我正在使用幾個大型數組,我只需要在代碼中的步驟之間。基本上我需要知道如何釋放由的AS創建一個數組變量所使用的內存:刪除,釋放或取消分配?
float arrayName[length][width];
要故意釋放一些自動存儲(項目上的「棧」),你可以做以下的 - 基本上你簡單地限制你的變量
改變代碼的範圍:
//...
float arrayName[length][width];
// ...
變化代碼:
//...
{
float arrayName[length][width];
// use arrayName here
//... still in-scope
} // scope limit
// all of arrayName released from stack
{
// stack is available for other use, so try
uint32_t u32[3][length][width];
// use u32 here
//... still in-scope
} // scope ended
// all of u32 released from stack
// better yet, use std::vector or another container
std::vector<uint32_t> bigArry;
注:矢量使用堆棧數量是有限的(我的系統上的24個字節), 不管你有多少個元素放進去!
在我的一款遊戲中,我使用了「typedef std :: vector
在我的答案的範圍限制大括號之間,請注意,您只需要一個函數或方法即可使許多KLOC代碼訪問「大」數據存儲。(但請記住通過參考傳遞它) –
你不需要任何特殊的語句。
如果數組是自動存儲持續時間的局部變量,或者如果它是靜態變量(在函數外聲明),則在退出函數或退出範圍時釋放該數組。
我想他是在談論單個函數中幾個大堆棧陣列的情況,他想要釋放在函數的其餘部分中沒有使用的那些函數 –
如果您遇到堆棧內存不足的情況,您可能需要在堆上分配內存。在這種情況下,您將需要新建陣列。
float** my_array = new float* [rowCount];
for(int i = 0; i < rowCount; ++i)
{
my_array[i] = new float[columnCount];
}
// and delete it later
for(int i = 0; i < rowCount; ++i)
{
delete [] my_array[i];
}
delete [] my_array;
不,你不需要這個。那裏有'columnCount'可能的內存泄漏。在思考如何解決它們之前,請注意Curious已經有了一個更簡單的建議,沒有內存泄漏。 – MSalters
你應該使用矢量這樣的東西。它是C++標準庫的一部分,在大多數實現中都經過了優化。當矢量超出範圍時,矢量佔用的內存將自動釋放。所以你永遠不必自己釋放記憶。
使用矢量的另一個好處是你不必擔心堆棧空間不足,因爲矢量佔用的所有「數組」內存都位於程序的堆中。
有關示例http://en.cppreference.com/w/cpp/container/vector/vector
除此之外,如果你認爲你的程序內存是永遠不會有足夠的,那麼你應該考慮使用磁盤作爲另一個存儲機制。數據庫以這種方式工作。他們將大部分數據存儲在磁盤上。
@Downvoter您可以留下評論,爲什麼你低估了這個答案? – Curious
考慮分配您的數組dinami而不是試圖釋放數組。 – MikeCAT
我會更關心如何更有效地*先分配內存,而不是通過自動變量。 – WhozCraig
你的堆棧有多少內存? Ubuntu 15.10(64)默認爲每個線程8 MBytes。如果你有nMBytes,你怎麼決定你正在使用'太多'? 50%90%的個人需求,或者很難理解崩潰? –