列表的析构函数删除虚拟c ++,基本问题

时间:2015-12-09 14:16:52

标签: c++ list pointers memory destructor

我有

}
?>
  1. 如果我有class Derived : public Base 如何免费列表?
  2. 如果std::list<G>中有std::list<G*>,我该如何免费提供该列表?
  3. 析构函数 - 哪一个应该是虚拟的,A的析构函数或A的析构函数?
  4. 我何时使用B以及何时使用list.clear()
  5. 同样的问题1-2,但有list.empty()
  6. 这是我的代码:

    std::vector

3 个答案:

答案 0 :(得分:1)

第一个问题:(列表)

  • 您的列表将在类销毁
  • 上自动删除

第二个问题:(列表指针)

  • 在类的析构函数中,您必须删除所有指针。使用std::shared_ptr<>的技巧会在没有人引用时自动销毁你的指针

关于您建议的代码:

最好使用auto(如果您使用的是C11或更新版本)而不是list::<Worker*>::iterator

for(auto it=workersInMovie.begin(); it!=workersInMovie.end(); it++){           
   delete *it; 
 }

}

答案 1 :(得分:0)

你需要自己释放指针。该列表没有指针专用,它对列表中存储的数据一无所知。即使它知道它存储指针(并且有专门化),那么它仍然仍然不知道指针是否应该被删除,如果你存储指针指向不是由new创建?

答案 2 :(得分:0)

  1. 您致电std::list::clear或让析构工具完成工作
  2. 在每个元素销毁之前调用delete(当然,只有当它被new分配时)
  3. 基类析构函数必须声明为virtual,它也会传播到派生类&#39;成员函数声明
  4. std::list::clear清除列表,std::list::empty会返回bool,告诉您列表是否为空(太难检查引用?)
  5. std::list
  6. 相同

    最简洁的析构函数版本(仍使用原始指针):

    Movie::~Movie() {
        for(auto x : workersInMovie)
            delete x;
    
        // no need to clear, std::list's destructor called afterwards
    }
    

    使用迭代器的工作版本:

    Movie::~Movie() {
        for(auto it = workersInMovie.begin();
            it != workersInMovie.end(); ++it)
            delete *it;
    }