列表的析构函数删除虚拟 C++,基本问题
destructor of a list delete virtual c++, basic questions
我有
class Derived : public Base
- 如果我有
std::list<G>
我该如何释放列表?
- 如果我在
A
中有一个 std::list<G*>
,我该如何释放列表?
- 析构函数 - 哪个应该是虚拟的,
A
的析构函数还是 B
的析构函数?
- 什么时候使用
list.clear()
什么时候使用 list.empty()
?
- 相同的问题 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
创建的?
- 您调用
std::list::clear
或让析构函数完成它的工作
- 你在销毁每个元素之前调用
delete
(当然,只有当它是用 new
分配的时候)
- Base class析构函数必须声明
virtual
,它也会传播到派生class'成员函数声明
std::list::clear
清除列表,std::list::empty
returns 一个 bool
告诉你列表是否为空(太难检查参考?)
- 与
std::list
相同
最干净的析构函数版本(仍然使用原始指针):
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;
}
}
我有
class Derived : public Base
- 如果我有
std::list<G>
我该如何释放列表? - 如果我在
A
中有一个std::list<G*>
,我该如何释放列表? - 析构函数 - 哪个应该是虚拟的,
A
的析构函数还是B
的析构函数? - 什么时候使用
list.clear()
什么时候使用list.empty()
? - 相同的问题 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
创建的?
- 您调用
std::list::clear
或让析构函数完成它的工作 - 你在销毁每个元素之前调用
delete
(当然,只有当它是用new
分配的时候) - Base class析构函数必须声明
virtual
,它也会传播到派生class'成员函数声明 std::list::clear
清除列表,std::list::empty
returns 一个bool
告诉你列表是否为空(太难检查参考?)- 与
std::list
相同
最干净的析构函数版本(仍然使用原始指针):
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;
}
}