从派生类中释放对象的位置



在构造类时需要很少的帮助:

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 的元素。

最新更新