【问题标题】:How can I delete a non-dynamically allocated array in C++?如何在 C++ 中删除非动态分配的数组?
【发布时间】:2012-04-02 19:22:59
【问题描述】:

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

【问题讨论】:

  • “非动态”是什么意思?静态存储?自动(“堆栈”)存储?
  • 为什么不使用像向量这样的容器来代替列表?

标签: c++ arrays hashtable


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    简短的回答:你不能。

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

    【讨论】:

    • @LuchianGrigore 两种方法,都远离语言级别:1.)您调整链接器脚本(可能通过在源代码中使用注释的宏处理器)。例如,可以使用 OVERLAY 将两个符号放在同一位置。通过使用第二个符号,您可以覆盖和重用您的数据。 2.)通过对齐将数据表放入内存页框。要释放,操作页表。但是,我认为这样做没有任何意义。
    • 你也可以手动调用析构函数,然后使用placement new调用构造函数。
    【解决方案3】:

    如果要手动控制内存的生命周期,则需要使用动态内存分配。非动态分配的内存(静态分配的)只有在内存超出范围时才会被释放。由于此内存存在于您管理的对象中,因此只有在拥有对象被释放时,该内存才会超出范围。

    因此,您需要在构造时动态分配缓冲区,然后在调整大小时分配新缓冲区,将旧缓冲区中的内容复制到新缓冲区中,删除旧缓冲区,然后将对象的内部指针分配给新缓冲区。比如:

    // 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*/)
    

    【讨论】:

      【解决方案4】:

      假设你有这样的东西:

      TableEntry table[max_table_size];
      

      您将需要一个单独的变量来指示您实际使用了多少数组:

      size_t table_size = 0;
      

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

      【讨论】:

        【解决方案5】:

        有很多方法可以解决这个问题。当然,“释放”未在堆上分配的内存 - 是可以想象的最糟糕的黑客攻击。

        我可能会建议这样的事情:

        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;
           }
        
        };
        

        【讨论】:

          猜你喜欢
          • 2018-05-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-11
          • 2015-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多