如何在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;
然后你只需要使用这个变量,而不是试图调整实际数组的大小。
相关文章:
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 动态更改数组的大小并读取值.(无矢量)
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 动态维度数组的 C++ 别名指针
- C++ 在析构函数调用之前删除的动态成员数组
- 从类 c++ 动态创建数组
- 具有静态 std::array 的神经网络比使用动态 C 数组的神经网络慢
- "Error reading character of string" 为哈希动态增长数组的问题 (C++)
- 为什么我们在传递动态 2D 数组时不需要列数?
- 如何解决在使用动态 2D 数组进行矩阵乘法的 MPI 进行并行编程时的问题
- 使用动态布尔数组时出现问题
- C++ 在类中删除动态 2D 数组时不断"Aborted (core dumped)"
- 如何在C 中动态输入数组
- 关于删除动态对象数组
- 在C 中动态更改数组大小
- 使用动态指针数组进行动态对象分配 - 使用什么删除?
- 动态字符串数组分配错误
- 函数中的动态 2D 数组分配并将其返回给主数组
- c++动态字符串数组分配
- 使用字符串或字符动态分配(数组)