代码之家  ›  专栏  ›  技术社区  ›  Raffaele Rossi

Qt对象所有权内存泄漏

  •  0
  • Raffaele Rossi  · 技术社区  · 6 年前

    我正在读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有一个层次结构,因为所有东西都是frm的后代 QObject 父对象将照顾孩子们的生活 . 在这种情况下,代码不会产生内存泄漏吗?

    因为 chatServer = new QTcpServer(); 等于 chatServer = new QTcpServer(nullptr); 我也是 指定父级!所以在堆里没有人照顾这个物体的生命。我必须打电话给 delete (或者更好地使用一个独特的ptr)来管理内存?

    另一个我会用的方法是 chatServer = new QTcpServer(server); . 可以吗?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Dan M.    6 年前

    如果这段代码确实是你书中所展示的全部,那么你是对的。如果你不把父母交给 QTcpServer 当您的对象被销毁时,它不会被自动删除。您也可以在析构函数中手动完成这项工作,或者甚至更好——只是不要使用指针,直接使用它(不过,如果您决定将对象移动到另一个线程,则可能需要使用指针)。

        2
  •  3
  •   user10186512    6 年前

    这看起来确实是内存泄漏。 chatServer 应该有 this 作为它的父级,它将被自动销毁 server 对象:

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

    假设这发生在 服务器 类,这将成为 QTcpServer 反对 服务器 反对。

    如果这本书没有具体的理由 qtcserver服务器 对象动态分配,这可能不是必需的。在这种情况下,正如Dan M.所说,完全有可能不使用指针,而只是 QTcpServer chatServer

        3
  •  0
  •   Stanley F.    6 年前

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

    但不是打电话 delete ,您可能需要使用QObject的插槽 deleteLater .