2016-03-08 58 views
2

我遇到了一個問題,我在堆棧上使用了太多的內存。我正在使用幾個大型數組,我只需要在代碼中的步驟之間。基本上我需要知道如何釋放由的AS創建一個數組變量所使用的內存:刪除,釋放或取消分配?

float arrayName[length][width]; 
+2

考慮分配您的數組dinami而不是試圖釋放數組。 – MikeCAT

+0

我會更關心如何更有效地*先分配內存,而不是通過自動變量。 – WhozCraig

+0

你的堆棧有多少內存? Ubuntu 15.10(64)默認爲每個線程8 MBytes。如果你有nMBytes,你怎麼決定你正在使用'太多'? 50%90%的個人需求,或者很難理解崩潰? –

回答

1

要故意釋放一些自動存儲(項目上的「棧」),你可以做以下的 - 基本上你簡單地限制你的變量

改變代碼的範圍:

//... 
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個字節), 不管你有多少個元素放進去!

+0

在我的一款遊戲中,我使用了「typedef std :: vector GameBoard_t」。注意這個向量的單個維度,但Gamboard是2個暗淡的。我只是使用一個函數來計算從行,列座標中的遊戲板索引...「static inline size_t gbIndx(int row,int col,int MAXCol){return((row * MAXCol)+ col);}。非常簡單且非常快速此外,許多對遊戲板的訪問不使用row,col和而是簡單地遍歷整個向量,例如:screenUpdate(),clearGameBoard() –

+0

在我的答案的範圍限​​制大括號之間,請注意,您只需要一個函數或方法即可使許多KLOC代碼訪問「大」數據存儲。(但請記住通過參考傳遞它) –

0

你不需要任何特殊的語句。

如果數組是自動存儲持續時間的局部變量,或者如果它是靜態變量(在函數外聲明),則在退出函數或退出範圍時釋放該數組。

+0

我想他是在談論單個函數中幾個大堆棧陣列的情況,他想要釋放在函數的其餘部分中沒有使用的那些函數 –

-1

如果您遇到堆棧內存不足的情況,您可能需要在堆上分配內存。在這種情況下,您將需要新建陣列。

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; 
+0

不,你不需要這個。那裏有'columnCount'可能的內存泄漏。在思考如何解決它們之前,請注意Curious已經有了一個更簡單的建議,沒有內存泄漏。 – MSalters

1

你應該使用矢量這樣的東西。它是C++標準庫的一部分,在大多數實現中都經過了優化。當矢量超出範圍時,矢量佔用的內存將自動釋放。所以你永遠不必自己釋放記憶。

使用矢量的另一個好處是你不必擔心堆棧空間不足,因爲矢量佔用的所有「數組」內存都位於程序的堆中。

有關示例http://en.cppreference.com/w/cpp/container/vector/vector

除此之外,如果你認爲你的程序內存是永遠不會有足夠的,那麼你應該考慮使用磁盤作爲另一個存儲機制。數據庫以這種方式工作。他們將大部分數據存儲在磁盤上。

+0

@Downvoter您可以留下評論,爲什麼你低估了這個答案? – Curious