我有相当深厚的 C 背景,并且在 C++ 方面有相当扎实的基础。最近我一直在使用 C# 和其他高级语言。我正在研究的一个项目确实可以从使用 QT4 中获益,但我对内存管理有一些我似乎无法理解的问题。我已经阅读了 QT4 文档,但对我帮助不大。这就是我来这里的原因。
1) 好的,首先,我知道使用 QT4 对象的最简单方法是在本地声明它们:
void MyFunc()
{
QString foo;
// do stuff to foo
}
这很简单,我可以拿走那个对象,然后传递它,并且知道当它超出范围时它就会被销毁。但这是我的问题。
1) 如果我创建一个 QList 并向其添加对象,然后 QList 超出范围,它会尝试释放子对象吗?
2)如果 QT4 例程返回指向对象的指针,那么我是否负责该对象的释放?
3)如果我创建一个 QWidget 的子类,并将其添加到 QWindow,我如何确保当 QWindow 被销毁时,它会带走我的小部件?
感谢您的帮助。
最佳答案
If I create a QList and add objects to it, and then the QList goes out of scope, will it try to deallocate the child objects?
QList 就像 std::list。它会在销毁时销毁包含的对象。
If a Qt4 routine returns a pointer to an object, am I then responsible for the de-allocation of that object?
通常不会,文档应该指定会发生什么。一个异常(exception)是 take* 函数(例如:QTableWidget::takeItem)。
If I create a subclass of a QWidget, and add it to a QWindow, how do I insure that when the QWindow is destroyed, that it takes my widget with it?
这取决于你如何创建子类对象。
- 您可以将它添加为窗口小部件的成员(顺便说一句,没有 QWindow),它会像任何成员变量一样被销毁。
- 您可以用 new 分配它并将它作为父窗口传递给窗口,由于 Qt 对象树实现(如蛋糕所述),它将被删除
- 您可以自己进行内存管理。
当一个 QWidget(或任何 QObject)被销毁时,它会将自己从其父级的待删除列表中删除,因此您可以自己删除它而不必担心重复删除。
关于c++ - QT4内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2200421/