我正在阅读一本关于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
。