清除向量被认为是管理内存的正确方法

时间:2014-04-07 02:21:54

标签: c++ memory-management vector

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

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

考虑以下代码片段:

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

};

erasehtable中的destructor函数是否会执行正确的内存管理?

2 个答案:

答案 0 :(得分:0)

  

我的htable类析构函数中的erase函数是否会执行正确的内存管理?

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

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

没有必要调用erase - vectorhtable对象析构函数运行时自动调用它包含的元素的任何析构函数 - 问题是node*元素不要触发任何破坏操作,因此您需要显式循环调用delete或使用智能指针。

另外,你有一个哈希集而不是一个地图......只有key个。

也许你应该尝试:

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

这将自动处理数据清理。

答案 1 :(得分:0)

如果您根本不想进行任何手动内存管理,则需要阐明哈希表元素的所有权。使用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编译器,除了在构造函数中使用初始化列表外,上述建议没有实际意义。