簡體   English   中英

如何在C ++中刪除非動態分配的數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM