Qt对象所有权内存泄漏

时间:2018-08-06 12:47:08

标签: c++ qt qt5

我正在阅读Qt入门书,并且正在编写以下代码:

server.h

library(gower)

d <- sapply(1:nrow(mtcars), function(i) gower_dist(mtcars[i,],mtcars))
d <- as.dist(d)
h <- hclust(d)
plot(h)

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

class server : public QObject {
    Q_OBJECT
private:
    QTcpServer* chatServer;

public:
    explicit server(QObject *parent = nullptr) : QObject(parent) {}

//more code...
};

#endif // SERVER_H

我已经在线阅读了Qt具有层次结构的信息,因为所有内容都从chatServer = new QTcpServer(); //<-- ?) chatServer->setMaxPendingConnections(10); 降级,并且父对象将照顾孩子的生活。在这种情况下,代码是否会产生内存泄漏?

因为QObject等于chatServer = new QTcpServer();,所以我指定父母!因此,没有人会照顾堆中该对象的寿命。我是否必须调用chatServer = new QTcpServer(nullptr);(或者最好使用unique_ptr)来管理内存?

我要使用的另一种解决方法是delete。可以吗?

3 个答案:

答案 0 :(得分:3)

这确实确实是内存泄漏。 chatServer应该以{{1​​}}作为其父对象,这样它将被this对象自动销毁:

server

假设这发生在chatServer = new QTcpServer(this); chatServer->setMaxPendingConnections(10); // ... more code 类的成员函数内,则会将server对象作为QTcpServer对象的父对象。

如果书中没有提供使server对象动态分配的特定原因,则可能没有必要。在这种情况下,正如Dan M.所说,完全不使用指针而只使用QTcpServer

是完全可能的

答案 1 :(得分:2)

如果此代码确实是您书中所显示的全部,那么您是正确的。如果您不将父项传递给QTcpServer,则销毁对象时不会将其自动删除。您也可以在析构函数中手动执行此操作,甚至可以做得更好-只是不要使用指针并直接使用它(尽管例如,如果决定将对象移动到另一个线程,则可能需要使用指针)。 / p>

答案 2 :(得分:0)

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

但是您可能不想使用delete,而是要使用QObject的插槽deleteLater