基本上,我有一个使用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);
}
我的问题如下:
提前致谢!
答案 0 :(得分:1)
- 考虑到Word结构有一个向量,它是否足以简单地调用~Word,或者我是否需要为向量调用析构函数 事先单独分开?
醇>
如果需要,您可以为struct
编写析构函数,但在这种情况下没有必要。
- 我是否需要为字符串调用析构函数(m_lines和Word.word),如果是,我该怎么做?它似乎没有 有一个像我可以调用的字符串的函数。
醇>
是的,你这样做。析构函数应该在那里,typedef
来自basic_string
,因此您应该在其上调用~basic_string()
。
- 我错过了什么吗?我很确定我有。
醇>
string
的析构函数。
另外,请确保正确计算malloc
的空间,不显示该代码,但要验证它应该是什么。
答案 1 :(得分:1)
您唯一缺少的是调用所有string
s'析构函数。它被称为~basic_string
(string
实际上只是typedef
basic_string
的一些模板参数。)
不,你不需要调用vector
s'析构函数,因为它们是由编译器为你的Word
结构提供的析构函数调用的。