在构造类时需要很少的帮助:
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。在我的第二堂课上,我有一个包含第一类指针的列表。如果是,我是否必须在第一类或二等析构函数中释放它们?
首先,从 QMap
中推导出来是一个糟糕的主意。主要是因为它是一个值类,不支持继承。了解不支持继承的类的最简单方法是当它们没有定义virtual
析构函数时。
值类不需要在堆上分配,除非您有令人信服的理由这样做。另请参阅: 更喜欢组合而不是继承?而这个
要销毁项目,您可以在析构函数中执行此操作
Fachbereich::~Fachbereich()
{
for(auto& item : permissions)
delete item;
}
是的,你应该在析构函数中释放它们。
由于Fachbereich
类分配数据,因此它也应该是释放数据的类。一般来说,如果一个类分配了某些东西,它也应该是释放它的人。
从不是编写的类继承时也要小心。为了使所有虚拟机制正常工作,基类应该有一个虚拟析构函数。如果没有,您可能会遇到在按住指向基类的指针时删除派生类的情况,因为它没有虚拟析构函数,只会销毁基类而不运行派生类的析构函数,从而导致令人讨厌的内存泄漏。可能还有其他非常微妙的问题,您很可能不想处理。
是的,你必须delete
它们。你可以在 Fachbereich
的析构函数中执行此操作,例如:
while (!permissions.isEmpty())
delete permissions.takeFirst();
你不能在 FBPermission
的析构函数中执行此操作,这是要new
ed 的元素。