2012-03-17 86 views
0

我問的原因是因爲我爲我的散列表使用非動態分配的數組;然而,對於我的哈希表中的我的rehash函數,我需要能夠更改我的舊數組的大小。我怎樣才能做到這一點?如何在C++中刪除非動態分配的數組?

+0

什麼是 「非動態」 是什麼意思?靜態存儲?自動(「堆棧」)存儲? – delnan 2012-03-17 15:06:04

+0

爲什麼不使用像vector這樣的容器而是使用list? – 2012-03-17 15:06:58

回答

3

如果你想改變大小,你必須動態分配它,最好使用std::vector

3

簡答:你不能。

較長的答案會引入非常髒和操作系統相關的黑客行爲。

+2

向我們展示一些這些黑客?我真的很好奇。 – 2012-03-17 15:11:18

+0

@LuchianGrigore兩個遠離語言級別的支持:1.)您可以調整鏈接描述文件(可能通過使用源代碼中的註釋的宏處理器)。例如,可以使用OVERLAY將兩個符號放在相同的位置。通過使用第二個符號,您可以覆蓋和重用您的數據。 2.)通過對齊將數據表放入內存頁框。釋放,操縱頁面表。但是,我認爲這樣做沒有意義。 – Matthias 2012-03-17 16:29:03

+0

您也可以手動調用析構函數,然後使用放置位置new調用構造函數。 – 2012-03-17 17:28:35

1

如果您想手動控制內存的生存期,則需要使用動態內存分配。非動態分配的內存(靜態分配)只會在內存超出範圍時解除分配。由於此內存駐留在您的管理對象中,因此當擁有對象處於釋放狀態時,該內存僅超出範圍。

所以你需要動態分配一個緩衝區,然後在調整大小時分配一個新緩衝區,將舊緩衝區中的內容複製到新緩衝區中,刪除舊緩衝區,然後將對象的內部指針分配給新緩衝區。喜歡的東西:

// allocate a new, bigger array 
Cell* newBuff = new Cells[/*newSize*/]; 

// copy into the new array 
for (i = 0; i < myBufferSize; ++i) 
{ 
    newBuff[i] = myBuffer[i]; 
} 
// delete the old array 
delete myBuffer; 
// point to the new array 
myBuffer = newBuff; 

你能立足於一個std::vector您的哈希表,而不是使用手動內存分配的?這將處理動態數組,你,你可以用一個簡單的.resize調整:

myBuffer.resize(/*newSize*/) 
-1

假設你有這樣的事情:

TableEntry table[max_table_size]; 

您將需要一個單獨的變量,表示如何你實際使用的陣列很多:

size_t table_size = 0; 

然後你只是使用該變量,而不是嘗試調整實際數組的大小。

0

有幾十種方法可以解決這個問題。當然,「釋放」沒有分配到堆上的內存 - 是想象中最糟糕的黑客。

我建議是這樣的:

class MyClass 
{ 
    TableEntry* m_pStaticTable[/* some size */]; 

    TableEntry* m_pActualTable; 
    size_t m_nSize; 

    MyClass() 
     :m_pActualTable(m_pStaticTable) 
     ,m_nSize(_countof(m_pStaticTable)) 
    { 
    } 

    ~MyClass() 
    { 
     if (m_pActualTable != m_pStaticTable) 
     delete[] m_pActualTable; 
    } 

};