Использование размещения new, malloc и free - PullRequest
0 голосов
/ 01 ноября 2011

По сути, у меня есть блок памяти, выделенный с помощью malloc, в который я хочу начать размещать объекты с использованием размещения new. Я знаю, что деструкторы для этих объектов должны быть явно вызваны, когда я их удаляю, но я хочу убедиться, что я полностью понимаю это и что я поступаю правильно. Я почти наверняка собираюсь отказаться от этого подхода и идти о вещах более простым способом, но я решил, что я бы попросил только ради понимания.

У меня есть класс WordIndex, который содержит следующие закрытые переменные-члены:

struct Word
{
    std::string word;
    std::vector<unsigned int> index;
};

Word* m_words;
std::string* m_lines;

Память выделяется / перераспределяется для обоих указателей с помощью malloc / realloc, а объекты создаются с использованием следующего кода (они не перезаписывают никакие ранее существующие объекты):

new (&m_words[pos]) Word();
new (&m_lines[m_numoflines]) std::string();

У меня есть деструктор, как показано ниже, но я почти на 100% уверен, что он работает неправильно, несмотря на то, что во время работы не отображаются ошибки.

WordIndex::~WordIndex()
{
    unsigned int i;
    for( i = 0; i < m_numofwords; i++)
    {
        m_words[i].~Word();
    }

    free(m_words);
    free(m_lines);
}

У меня следующие вопросы:

  1. Учитывая, что структура Word имеет вектор, достаточно ли просто вызвать ~ Word или мне нужно заранее вызвать деструктор для вектора отдельно?
  2. Нужно ли вызывать деструктор для строки (как для m_lines, так и для Word.word), и если да, то как мне это сделать? Похоже, у него нет функции наподобие ~ string, которую я могу вызвать.
  3. Я что-то пропустил? Я вполне уверен, что у меня есть.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Единственное, что вам не хватает - это вызов всем деструкторам string s.Он называется ~basic_string (string на самом деле просто typedef для basic_string с некоторыми параметрами шаблона).

Нет, вам не нужно вызывать деструкторы vector s, потому чтоони вызываются деструктором, предоставленным компилятором для вашей Word структуры.

1 голос
/ 01 ноября 2011
  1. Учитывая, что структура Word имеет вектор, достаточно ли просто вызвать ~ Word или мне нужно заранее вызвать деструктор для вектора отдельно?

Вы можете написать деструктор для вашего struct, если хотите, но в этом случае это не нужно.

  1. Нужно ли вызывать деструктор для строки (оба для m_linesи для Word.word), и если да, то как мне это сделать?Похоже, у него нет функции наподобие ~ string, которую я могу вызвать.

Да, вы делаете.Деструктор должен быть там, он typedef издан из basic_string, так что вы должны звонить ~basic_string().

  1. Я что-то пропустил?Я вполне уверен, что у меня есть.

Деструктор для string.

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

...