Я попытался сделать заголовок вопроса максимально наглядным, поэтому вам не придется нажимать на вопрос, чтобы выяснить, есть ли у вас ответ на мой вопрос.
Я реализую 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
выполняют надлежащее управление памятью?
Будет ли функция стирания в моем деструкторе класса htable выполнять правильное управление памятью?
Нет. Ваш vector<node*>
не использует интеллектуальные указатели, поэтому он ничего не делает для вызова деструкторов и освобождения памяти для объектов в структуре данных.
Выполнение delete
на каждом node*
(или использование интеллектуальных указателей) является хорошим первым шагом, но этого будет недостаточно, поскольку деструктор node
не вызывает деструктор для связанного node
s.
Нет необходимости вызывать erase
- vector
автоматически вызывает любые деструкторы для содержащихся в нем элементов, когда выполняется htable
объекта htable
- проблема в том, что элементы node*
не запускают никаких действий по уничтожению, поэтому вам нужен явный цикл, вызывающий delete
или используйте интеллектуальные указатели.
Отдельно у вас есть хеш-набор, а не карта... есть только key
s.
Возможно, вам стоит попробовать:
std:vector<std::list<std::string>>
Это автоматически позаботится об очистке данных.
Если вы хотите практически полностью управлять ручным управлением памятью, вам необходимо выяснить право собственности на элементы вашей хеш-таблицы. Использование 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)){}
Хотя, если у вас нет доступа к компилятору С++ 11, приведенные выше советы являются спорными, за исключением использования списка инициализаторов в вашем конструкторе.
node
для связанного списка, но используетеvector
?