2017-01-11 9 views
0

Qt 5.7.0で使用したQObjectポインタを削除しますか?例えば、私は、コードをQObjectポインタを使用した後でQObjectポインタを削除しますか?

を持っている:私たちはQObjectポインタを削除しないので、

std::string login; 
std::string password; 
if (serviceId == 11) { 
    QObject* loginField = this->parent()->findChild<QObject*>("wifiLogintxt1"); 
    QObject* passwordField = this->parent()->findChild<QObject*>("wifiPasswordtxt1"); 
    login = loginField->property("text").toString().toStdString(); 
    password = passwordField->property("text").toString().toStdString(); 
} else { 
    QObject* loginField = this->parent()->findChild<QObject*>("inputField1"); 
    login = loginField->property("text").toString().toStdString(); 
} 

は、メモリリークのコードつながりますか?

+0

いいえ、Qtの – Danh

+1

[作成とQtのウィジェットオブジェクトを割り当て解除]の可能複製(http://stackoverflow.com/questions/4267854/creating-and-deallocating-a-qtにこれらのポインタを削除しないでください-widget-object) – Danh

+0

ポインタは所有者によって削除される必要があります。親ウィジェットはあなたの 'QObjects'変数の所有者です。だからあなたはそれらを削除すべきではありません。 –

答えて

3

いいえ、あなたはこれらのオブジェクトを削除しないでください、彼らは彼らの親QObject Sで管理されている、QObject trees and ownershipを参照してください。

findChildを使用して、あなたは、この親が管理し、同じオブジェクトへのポインタを取得しています。

したがって、loginField,passwordFieldは、親ウィジェットが削除されると削除されます(thisあなたのケースではインスタンス)。それらを削除すると、それらはGUIから消えます。親ウィジェットがもはや必要ではないと判断するまで(破棄されるまで)、次のようにしなければなりません。

あなた自身も削除することができます。たとえば、ユーザーがツールバーを削除すると、アプリケーションがそのQToolBarオブジェクトの1つを削除することがあります。この場合、ツールバーのQMainWindow親はその変更を検出し、それに応じて画面スペースを再設定します。

+0

上記のコードを繰り返し呼び出す状況を想像してみてください。それは新しい 'QObject * loginField'を作成するので、より多くのメモリを使用するでしょうか? –

+1

いいえ、 'loginField'は、私の答えで言ったように、親によって管理されている同じオブジェクトへのポインタを常に得ます。したがって、追加の割り当ては行われません。 – Mike