我问的原因是因为我正在为哈希表使用非动态分配的数组;但是,对于我的散列表中的rehash函数,我需要能够更改旧数组的大小。我怎么能这样做?
答案 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;
然后你只使用该变量而不是试图调整实际数组的大小。