我正在阅读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
。可以吗?
答案 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
。