使用placement new,malloc和free

时间:2011-10-31 22:31:30

标签: c++ malloc free destructor placement-new

基本上,我有一个使用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),如果是,我该怎么做?它似乎没有像我可以调用的〜字符串这样的函数。
  3. 我错过了什么吗?我很确定我有。
  4. 提前致谢!

2 个答案:

答案 0 :(得分:1)

  
      
  1. 考虑到Word结构有一个向量,它是否足以简单地调用~Word,或者我是否需要为向量调用析构函数   事先单独分开?
  2.   

如果需要,您可以为struct编写析构函数,但在这种情况下没有必要。

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

是的,你这样做。析构函数应该在那里,typedef来自basic_string,因此您应该在其上调用~basic_string()

  
      
  1. 我错过了什么吗?我很确定我有。
  2.   

string的析构函数。

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

答案 1 :(得分:1)

您唯一缺少的是调用所有string s'析构函数。它被称为~basic_stringstring实际上只是typedef basic_string的一些模板参数。)

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