2015-10-23 35 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)以獲取插槽中的智能指針。 –