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

时间:2012-03-17 15:03:45

标签: c++ arrays hashtable

我问的原因是因为我正在为哈希表使用非动态分配的数组;但是,对于我的散列表中的rehash函数,我需要能够更改旧数组的大小。我怎么能这样做?

5 个答案:

答案 0 :(得分:3)

如果要更改大小,则必须动态分配,最好使用std::vector

答案 1 :(得分:3)

简短的回答:你做不到。

更长的答案会引入非常肮脏和依赖于操作系统的黑客攻击。

答案 2 :(得分: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*/)

答案 3 :(得分: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;
   }

};

答案 4 :(得分:-1)

假设你有类似的东西:

TableEntry table[max_table_size];

您将需要一个单独的变量来指示您实际使用的阵列数量:

size_t table_size = 0;

然后你只使用该变量而不是试图调整实际数组的大小。