【问题标题】:Is clearing a vector considered a proper way of managing memory清除被认为是管理内存的正确方法的向量
【发布时间】:2014-04-07 02:21:53
【问题描述】:

我试图使问题标题尽可能具有描述性,这样您就不必单击问题来确定您是否对我的问题有答案。

我正在为课堂作业实施chaining hash table,我得出的结论是vector 最适合我的项目。

考虑下面的sn-p代码:

struct node
{
public:
    node(string key, node * next = NULL)
    {
        this->key = key;
        this->next = next;
    }

    string key;
    node * next;
};

class htable
{
private:
    static const int TABLE_SIZE = 100;
    vector <node*> table;


public:
    htable()
    {
        table.resize(TABLE_SIZE);
        for (int i = 0; i < TABLE_SIZE; i++)
            table[i] = NULL;
    }

    ~htable()
    {
        table.erase(table.begin(), table.begin() + TABLE_SIZE);
    }

};

我的htabledestructor 中的erase 函数会执行正确的内存管理吗?

【问题讨论】:

  • 为什么要为链表设计node,却用vector实现?
  • 在我看来,在实现哈希表时,您只需要两个向量即可。第一个向量包含项目(键、值、哈希、其他项目的索引以进行链接),另一个向量基本上是散列表。唯一重要的技巧是,当您从 items 向量中删除一个项目时,而不是简单地删除它并将所有较高索引的项目移动到较低的索引,您只需将 items 向量的最后一项移动到已删除项目的位置,然后您修复了链接索引。无需到处分配节点...

标签: c++ memory-management vector


【解决方案1】:

我的 htable 类析构函数中的擦除函数会执行正确的内存管理吗?

没有。您的vector&lt;node*&gt; 不使用智能指针,因此它不会调用析构函数,也不会为数据结构中的对象释放内存。

在每个node* 上执行delete(或使用智能指针)是一个很好的第一步,但这还不够,因为node 析构函数不会为链接@ 调用析构函数987654325@s.

无需调用erase - 当htable 对象析构函数运行时,vector 会自动为其包含的元素调用任何析构函数 - 问题是node* 元素不会触发任何销毁操作,所以你需要显式循环调用delete 或使用智能指针。

另外,你有一个哈希集而不是一个映射......只有keys。

也许你应该试试:

std:vector<std::list<std::string>>

这将自动处理数据清理。

【讨论】:

    【解决方案2】:

    如果您根本不想进行任何手动内存管理,则需要明确哈希表元素的所有权。使用std::vector 是个好主意,但您还需要确定您的链是双链接还是单链接。如果它们是单独链接的,最好有一个唯一指针的向量:

    std::vector<std::unique_ptr<node>> table;
    

    否则您希望共享所有权:

    std::vector<std::shared_ptr<node>> table;
    

    另请注意,您没有正确使用构造函数。您需要利用构造函数中的初始化列表:您可以通过在初始化列表中调用适当的向量构造函数来简单地将向量设置为 TABLE_SIZE,如下所示:

    htable():table(TABLE_SIZE, std::make_shared<node>(nullptr)){}
    

    虽然如果您无法访问 C++11 编译器,上述建议是没有实际意义的,除非在构造函数中使用初始化列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2018-06-19
      相关资源
      最近更新 更多