0

基本上,我有一块使用 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);
}

我的问题如下:

  1. 考虑到 Word 结构有一个向量,简单地调用 ~Word 就足够了,还是我需要事先单独调用向量的析构函数?
  2. 我是否需要为字符串(m_lines 和 Word.word)调用析构函数,如果需要,我该怎么做?它似乎没有我可以调用的 ~string 之类的函数。
  3. 我还有什么遗漏吗?我相当肯定我有。

提前致谢!

4

2 回答 2

1
  1. 考虑到 Word 结构有一个向量,只需调用 ~Word 就足够了,还是我需要事先单独调用向量的析构函数?

如果你愿意,你可以为你写一个析构函数struct,但在这种情况下它不是必需的。

  1. 我是否需要为字符串(m_lines 和 Word.word)调用析构函数,如果需要,我该怎么做?它似乎没有我可以调用的 ~string 之类的函数。

是的你是。析构函数应该在那里,它typedef来自basic_string,所以你应该调用~basic_string()它。

  1. 我还有什么遗漏吗?我相当肯定我有。

的析构函数string

另外,请确保malloc正确计算空间,不要显示该代码,而是验证它应该是什么。

于 2011-10-31T22:37:31.640 回答
1

您唯一缺少的是对所有strings 析构函数的调用。它被称为~basic_stringstring实际上只是一个带有一些模板参数的typedeffor )。basic_string

不,您不需要调用vectors 的析构函数,因为它们是由编译器为您的Word结构提供的析构函数调用的。

于 2011-10-31T22:39:44.223 回答