【问题标题】:C++ Initializing without New or Malloc/Calloc/etc没有 New 或 Malloc/Calloc/etc 的 C++ 初始化
【发布时间】:2017-12-18 19:16:50
【问题描述】:

所以,代码如下所示。我一直在实现一个很简单的HashMap,HashEntry类也定义的很简单。

现在我对 C++ 不是超级有经验,但可以说 new、delete 和 malloc/free/realloc/etc 都会导致我的系统崩溃并且需要调整代码。如果没有这些工具,我真的不确定如何处理构造函数和解构函数。

我知道一些事情,例如一个字符串,我可以像这样初始化:string program(sizeVariable),但我真的不知道如何使用这一行来做到这一点table = new HashEntry*[TABLE_SIZE]; 然后也丢失了处理丢失在解构中删除。

感谢任何答案或建议,也请原谅它在我的 IDE 中看起来不那么难看的格式。

class HashMap {
    private:
       HashEntry **table;
    public:
       HashMap() 
       {
            table = new HashEntry*[TABLE_SIZE];
            for (int i = 0; i < TABLE_SIZE; i++)
                table[i] = NULL;
       }
  ...
       ~HashMap()
       {
            for (int i = 0; i < tableSize; i++)
                if (table[i] != NULL)
                    delete table[i];
            delete[] table;
       }

}

【问题讨论】:

  • 相关,为什么不使用std::vector 的智能指针和体面的异常处理值得深思。
  • 发布的代码对我来说看起来不错。但是,您应该查看The Rule of Three
  • @VittorioRomeo,在编程实践方面做得不好,但在正确性方面做得很好。
  • OT:delete正确处理nullptr,不需要自己实现测试。
  • 对于那个特定代码,如果这是某种静态练习,那么看似固定的哈希图可能只是非动态的。 IE。成员变量HashEntry* table[TABLE_SIZE]; 将消除分配和释放。但是,您仍然需要执行空填充和正确的循环清理。如果没有HashEntry 的静态池可以从中获取(例如线性探测和碰撞溢出的增量),delete table[i]; 似乎是不可避免的。

标签: c++ memory constructor malloc calloc


【解决方案1】:

new、delete 和 malloc/free/realloc/etc 全部

您几乎不应该在 C++ 中使用任何这些。手动内存管理对于日常 C++ 开发来说几乎是死路一条。还有很多更好的选择:

  • unique_ptrshared_ptr 等智能指针。

  • std::vectorstd::array 等容器。

您需要阅读一本好的现代 C++ 入门书籍。以"A Tour of C++" 开头。


如果您正在做手动资源管理(...为什么?),您还想关注rule of five

【讨论】:

  • 好的,谢谢,是的,我认为我在 C++ 中收到的指令可能有点陈旧
猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2011-05-05
  • 2017-09-08
相关资源
最近更新 更多