4

私のコードでは

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

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

問題のコード: connect() のmyNetworkAccessManager.get( )

私の質問は、それを行う最良の方法は何ですか?

私はここの記事を読ん でいて、レガシーコードの下に書かれています:

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

この link stackoverflowを読むと、 data() を使用することが正しい解決策のようです。つまり、stl から get() を使用することも正しいということです。

4

1 に答える 1

4

Qt には独自のメモリ管理メカニズムがあるため、そのメカニズムで処理されるオブジェクトを使用std::unique_ptrすることは正しくありません。親子関係を正しく定義し、Qt に任せることをお勧めします。

于 2015-10-23T02:16:42.960 に答える