[英]How can I delete a non-dynamically allocated array in C++?
我問的原因是因為我在哈希表中使用了非動態分配的數組。 但是,對於哈希表中的rehash函數,我需要能夠更改舊數組的大小。 我怎樣才能做到這一點?
如果要更改大小,則必須動態分配,最好使用std::vector
。
簡短的答案:您不能。
更長的答案將引入非常骯臟且依賴於操作系統的黑客。
如果要手動控制內存的生存期,則需要使用動態內存分配。 非動態分配的內存(靜態分配)僅在內存超出范圍時才被釋放。 由於此內存位於您要管理的對象中,因此僅當釋放擁有的對象時,該內存才會超出范圍。
因此,您將需要在構造時動態分配一個緩沖區,然后在調整大小時分配一個新緩沖區,將內容從舊緩沖區復制到新緩沖區,刪除舊緩沖區,然后將對象的內部指針分配給新緩沖區。 就像是:
// 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*/)
有很多方法可以解決這個問題。 當然,“取消分配”未在堆上分配的內存是想象中最糟糕的事情。
我可能會建議這樣的事情:
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;
}
};
假設您有這樣的事情:
TableEntry table[max_table_size];
您將需要一個單獨的變量,該變量指示您實際使用了多少數組:
size_t table_size = 0;
然后只使用該變量,而不是嘗試調整實際數組的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.