2015-10-23 36 views
1

在我的代码的unique_ptr并传递到相关连接

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

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

代码:myNetworkAccessManager.get()在连接()

我的问题是什么是做到这一点的最好方法是什么?

我读这里的文章article 它下遗留代码说:

调用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似乎使用数据()是正确的解决方案。这意味着从stl使用get()也是正确的。

回答

3

Qt有it's own memory management mechanism,所以对于使用该机制处理的对象使用std::unique_ptr是不正确的。我会建议您确保正确定义父子关系,并让Qt为您处理。

+0

我更新了我的代码以使用QScopedPointer并且想知道在connect()中data()的使用是否正确 – adviner

+0

正如@Jefffrey指出的那样,Qt有自己的内存管理,但是使用get() )或data()没有错。由于对象必须是用于连接的QObject,Qt只是使用指针来监视对象的生命周期,它不会尝试获取所有权。还有其他地方,这是绝对不正确的,但对于信号和插槽它应该在大多数情况下没有问题的工作。熟悉[std :: enabled_shared_from_this](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)以获取插槽中的智能指针。 –