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

destructor of a list delete virtual c++, basic questions

我有

class Derived : public Base
  1. 如果我有 std::list<G> 我该如何释放列表?
  2. 如果我在 A 中有一个 std::list<G*>,我该如何释放列表?
  3. 析构函数 - 哪个应该是虚拟的,A 的析构函数还是 B 的析构函数?
  4. 什么时候使用 list.clear() 什么时候使用 list.empty()
  5. 相同的问题 1-2,但带有 std::vector?

这是我的代码:

class Movie{
    list<Worker*> workersInMovie;
    list<G> g;

    Movie::~Movie() {
        for(list::<Worker*>::iterator it = workersInMovie.begin();
            it != workersInMovie.end(); ++it;)
            delete it;

        g.clear();
    }
};

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

  1. 您调用 std::list::clear 或让析构函数完成它的工作
  2. 你在销毁每个元素之前调用 delete(当然,只有当它是用 new 分配的时候)
  3. Base class析构函数必须声明virtual,它也会传播到派生class'成员函数声明
  4. std::list::clear 清除列表,std::list::empty returns 一个 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;
}

第一个问题:(列表)

  • 您的列表将在 class 销毁
  • 时自动删除

第二题:(列表指针)

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

关于您提出的代码:

list::<Worker*>::iterator

更好地使用 auto(如果您使用的是 C11 或更新版本)
for(auto it=workersInMovie.begin(); it!=workersInMovie.end(); it++){           
   delete *it; 
 }

}