基本上,我有一块使用 malloc 分配的内存,我想开始使用placement 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 之类的函数。
- 我还有什么遗漏吗?我相当肯定我有。
提前致谢!