如何在C++中删除非动态分配的数组

How can I delete a non-dynamically allocated array in C++?

本文关键字:动态分配 数组 删除 C++      更新时间:2023-10-16

我之所以这么问,是因为我的哈希表使用了一个非动态分配的数组;然而,对于哈希表中的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;

然后你只需要使用这个变量,而不是试图调整实际数组的大小。