unique_ptr和传递给connect函数

4

在我的代码中

std::unique_ptr<QNetworkAccessManager> myNetworkAccessManager;
...
myNetworkAccessManager.reset(new QNetworkAccessManager(this));

QObject::connect(myNetworkAccessManager.get(), SIGNAL(finished(QNetworkReply *)), this, SLOT(OnNetworkFinished(QNetworkReply *)));

需要翻译的内容:

代码中的问题:myNetworkAccessManager.get()在connect()函数中。

我的问题是,最好的方法是什么?

我在这里阅读了这篇文章article,其中在Legacy Code下说:

调用get()会返回指向底层方法的指针。如果可以避免调用它,那么你真的应该避免,因为一旦你将该原始指针释放到野外,你就失去了切换到unique_ptr所获得的大部分优势。

更新

如果我改用QScopedPointer,我的代码将如下所示:

QScopedPointer<QNetworkAccessManager> myNetworkAccessManager;
...
myNetworkAccessManager.reset(new QNetworkAccessManager(this));

QObject::connect(myNetworkAccessManager.data(), SIGNAL(finished(QNetworkReply *)), this, SLOT(OnNetworkFinished(QNetworkReply *)));

这是否是正确的解决方案呢:
connect(myNetworkAccessManager.data()

更新2

阅读这个链接stackoverflow,似乎使用data()是正确的解决方法。这意味着使用stl中的get()也是正确的。

1个回答

4

Qt有自己的内存管理机制,因此对于使用该机制处理的对象,使用std::unique_ptr是不正确的。我建议只需确保正确定义父子关系,让Qt为您处理。


我更新了我的代码,使用了QScopedPointer,并想知道在connect()中使用data()的方法是否正确。 - adviner
正如@Jeffrey指出的那样,Qt拥有自己的内存管理,但使用get()或data()来获取对象指针并不是错误的。由于对象必须是一个QObject才能进行connect操作,因此Qt只使用指针来监视对象的生命周期,而不尝试取得所有权。在其他地方,这种做法肯定是不正确的,但对于信号和槽,它应该可以在大多数情况下正常工作。熟悉std::enabled_shared_from_this,以在槽中获得智能指针。 - CJCombrink
考虑到多年来这个问题从未得到纠正,请记住并非所有的Qt对象都由Qt的内存管理机制处理。奇怪的是,Qt关于对象树和所有权的文档展示了一些没有父对象的例子,特别是在堆栈中声明它们的典型示例。鉴于堆栈的容量非常有限(默认情况下,在Windows上为1MB,在Linux/macOS上约为8MB),因此习惯上使用智能指针(如std::unique_ptr)在堆中声明根对象,并管理其生命周期。 - RAM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接