Qt对象所有权内存泄漏

Qt object ownership memory leak

本文关键字:泄漏 内存 所有权 对象 Qt      更新时间:2023-10-16

我正在阅读一本关于Qt的介绍书,我正在编写以下代码:

服务器.h

class server : public QObject {
Q_OBJECT
private:
QTcpServer* chatServer;
public:
explicit server(QObject *parent = nullptr) : QObject(parent) {}
//more code...
};
#endif // SERVER_H

然后这本书建议以这种方式创建对象:

chatServer = new QTcpServer();  //<-- ?)
chatServer->setMaxPendingConnections(10);

我在网上读到Qt有一个层次结构,因为一切都从QObject开始,父对象将负责孩子们的生活。在这种情况下,代码不会产生内存泄漏吗?

因为chatServer = new QTcpServer();等于chatServer = new QTcpServer(nullptr);,所以我不是指定父级!所以没有人关心堆中这个对象的生命。我必须调用delete(或者更好地使用unique_ptr(来管理内存吗?

我会使用的另一个修复程序是chatServer = new QTcpServer(server);。这样可以吗?

如果这段代码确实是你书中显示的全部内容,那么你是正确的。如果不将父对象传递给QTcpServer,则在对象销毁时不会自动删除它。你也可以在析构函数中手动执行,或者更好——只是不要使用指针,而是直接使用它(尽管如果你决定将对象移动到另一个线程,你可能需要使用指针(。

这似乎确实是内存泄漏。chatServer应该将this作为其父对象,因此它将自动与server对象一起销毁:

chatServer = new QTcpServer(this);
chatServer->setMaxPendingConnections(10);
// ... more code

假设这发生在server类的成员函数内部,则这将使QTcpServer对象成为server对象的父对象。

如果这本书没有提供动态分配QTcpServer对象的具体理由,那么可能就没有必要了。在这种情况下,正如Dan M.所说,完全可以不使用指针,只使用QTcpServer chatServer

在您发布的示例中,您必须自己处理指针。

但是,您可能希望使用QObject的插槽deleteLater,而不是调用delete