【发布时间】:2012-04-02 19:22:59
【问题描述】:
我问的原因是因为我为我的哈希表使用了一个非动态分配的数组;但是,对于哈希表中的 rehash 函数,我需要能够更改旧数组的大小。我该怎么做?
【问题讨论】:
-
“非动态”是什么意思?静态存储?自动(“堆栈”)存储?
-
为什么不使用像向量这样的容器来代替列表?
我问的原因是因为我为我的哈希表使用了一个非动态分配的数组;但是,对于哈希表中的 rehash 函数,我需要能够更改旧数组的大小。我该怎么做?
【问题讨论】:
如果要更改大小,则必须动态分配,最好使用std::vector。
【讨论】:
简短的回答:你不能。
更长的答案会引入非常肮脏和依赖于操作系统的黑客行为。
【讨论】:
OVERLAY 将两个符号放在同一位置。通过使用第二个符号,您可以覆盖和重用您的数据。 2.)通过对齐将数据表放入内存页框。要释放,操作页表。但是,我认为这样做没有任何意义。
如果要手动控制内存的生命周期,则需要使用动态内存分配。非动态分配的内存(静态分配的)只有在内存超出范围时才会被释放。由于此内存存在于您管理的对象中,因此只有在拥有对象被释放时,该内存才会超出范围。
因此,您需要在构造时动态分配缓冲区,然后在调整大小时分配新缓冲区,将旧缓冲区中的内容复制到新缓冲区中,删除旧缓冲区,然后将对象的内部指针分配给新缓冲区。比如:
// 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*/)
【讨论】:
假设你有这样的东西:
TableEntry table[max_table_size];
您将需要一个单独的变量来指示您实际使用了多少数组:
size_t table_size = 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;
}
};
【讨论】: