Является ли очистка вектора правильным способом управления памятью?

0

Я попытался сделать заголовок вопроса максимально наглядным, поэтому вам не придется нажимать на вопрос, чтобы выяснить, есть ли у вас ответ на мой вопрос.

Я реализую 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
    Почему вы проектируете node для связанного списка, но используете vector ?
  • 0
    Когда дело доходит до реализации хеш-таблицы, все, что мне нужно, это два вектора по моему мнению. Первый вектор содержит элементы (ключ, значение, хэш, индекс для другого элемента для сцепления), а другой вектор - это, в основном, таблица хеширования. Единственный нетривиальный трюк заключается в том, что когда вы удаляете элемент из вектора элементов, то вместо простого удаления его и перемещения всех элементов с более высоким индексом в более низкий индекс вы просто перемещаете последний элемент вектора элементов на место удаленного элемента и Вы исправляете цепочечные индексы. нет необходимости выделять узлы здесь и там ...
Теги:
vector
memory-management

2 ответа

0

Будет ли функция стирания в моем деструкторе класса htable выполнять правильное управление памятью?

Нет. Ваш vector<node*> не использует интеллектуальные указатели, поэтому он ничего не делает для вызова деструкторов и освобождения памяти для объектов в структуре данных.

Выполнение delete на каждом node* (или использование интеллектуальных указателей) является хорошим первым шагом, но этого будет недостаточно, поскольку деструктор node не вызывает деструктор для связанного node s.

Нет необходимости вызывать erase - vector автоматически вызывает любые деструкторы для содержащихся в нем элементов, когда выполняется htable объекта htable - проблема в том, что элементы node* не запускают никаких действий по уничтожению, поэтому вам нужен явный цикл, вызывающий delete или используйте интеллектуальные указатели.

Отдельно у вас есть хеш-набор, а не карта... есть только key s.

Возможно, вам стоит попробовать:

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

Это автоматически позаботится об очистке данных.

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

Хотя, если у вас нет доступа к компилятору С++ 11, приведенные выше советы являются спорными, за исключением использования списка инициализаторов в вашем конструкторе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню