我试图让问题标题尽可能具有描述性,这样您就不必点击问题来确定您是否对我的问题有答案。
我正在为课堂作业实施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);
}
};
erase
类htable
中的destructor
函数是否会执行正确的内存管理?
答案 0 :(得分:0)
我的htable类析构函数中的erase函数是否会执行正确的内存管理?
没有。您的vector<node*>
不使用智能指针,因此它不会调用析构函数,也不会释放数据结构中对象的内存。
在每个delete
上执行node*
(或使用智能指针)是一个很好的第一步,但这还不够,因为node
析构函数不会调用析构函数(s)链接node
s。
没有必要调用erase
- vector
在htable
对象析构函数运行时自动调用它包含的元素的任何析构函数 - 问题是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编译器,除了在构造函数中使用初始化列表外,上述建议没有实际意义。