从派生类中释放对象的位置
where to free objects from a derived class?
在构造类时需要很少的帮助:
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 的元素。
相关文章:
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 无法获取webot::PositionSensor对象中位置传感器的值
- 使用迭代器时如何访问对象在向量中的位置?
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 在C++代码中搜索对象的实例化位置
- 在特定内存位置构造 c++ 对象
- delete如何知道对象在内存中的起始位置
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 在C++标准中记录对象的内存布局的哪个位置?
- QT:即使在static_cast后也无法在主窗口中设置对象的位置
- 将光标位置存储在类对象中(ncurses c++)
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 如何在3D世界中获得对象相对于父母的绝对位置
- 如何在C 2D向量中找到对象(而不是int)的位置
- 从文件对象的当前位置删除字符
- 将对象位置与网格对齐
- D3DXVec3项目需要一半的对象位置
- Cocos 2dx 人像模式对象位置混乱
- 如何使用Qt的QGLWidget准确更新OpenGL中的对象位置?
- 运算符重载-如何更改对象位置