По сути, у меня есть блок памяти, выделенный с помощью 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);
}
У меня следующие вопросы:
- Учитывая, что структура Word имеет вектор, достаточно ли просто вызвать ~ Word или мне нужно заранее вызвать деструктор для вектора отдельно?
- Нужно ли вызывать деструктор для строки (как для m_lines, так и для Word.word), и если да, то как мне это сделать? Похоже, у него нет функции наподобие ~ string, которую я могу вызвать.
- Я что-то пропустил? Я вполне уверен, что у меня есть.
Заранее спасибо!