在构建课程时需要一些帮助:
FBPermission::FBPermission(QString aName): QMap<QString, bool>()
{
Name = aName;
insert("read", false);
insert("write", false);
insert("rename", false);
insert("delete", false);
}
FBPermission:: ~FBPermission(){}
Fachbereich::Fachbereich()
{
permissions= QList<FBPermission *>();
FBPermission * perm = new FBPermission("admin");
perm->insert("read", true);
perm->insert("write", true);
perm->insert("rename", true);
perm->insert("delete", true);
permissions.append(perm);
}
Fachbereich::~Fachbereich()
{
}
我的第一堂课是从QMap派生的。在我的第二课中,我拿着一个包含头等指针的列表。如果是的话,我是否必须在析构函数中释放它们,在第一类或第二类的析构函数中?
答案 0 :(得分:1)
是的,你应该在析构函数中释放它们。
由于Fachbereich
类分配数据,因此它也应该是解除分配数据的类。通常,如果一个类分配了某些东西,那么它也应该是释放它的那个。
从未编写的类继承时也要小心。为了使所有虚拟机制正常工作,基类应该有一个虚拟析构函数。如果不是这样,您可能会遇到这样一种情况,即在保存指向基类的指针时删除派生类,因为它没有虚拟析构函数,只会销毁基类而不运行派生类的析构函数,导致令人讨厌的内存泄漏。可能还有其他非常微妙的问题,你很可能不想处理。
答案 1 :(得分:0)
是的,你必须delete
他们。您可以在Fachbereich
的析构函数中执行此操作,例如:
while (!permissions.isEmpty())
delete permissions.takeFirst();
您无法在FBPermission
的析构函数中执行此操作,这是new
编辑的元素。
答案 2 :(得分:0)
首先,从QMap
得出一个可怕的想法。主要是因为它是一个值类而不支持继承。知道不支持继承的类的最简单方法是don't define a virtual
destructor。
不需要在堆上分配值类,除非你有令人信服的理由这样做。另外,请参阅:Prefer composition over inheritance?和this
要销毁这些项目,你可以在析构函数
中完成Fachbereich::~Fachbereich()
{
for(auto& item : permissions)
delete item;
}