2017-10-26 28 views
0

私には、QAbstractListModelを継承するクラスがあります。 setContextProperty()でqmlに登録されたインスタンス(new演算子で動的に作成されたインスタンス)です。 QmlではGridLayoutRepeaterで使用されます。私は、次のコードでQMLからそれを実行します:SetContextPropertyを使用してqmlに登録されたC++モデルを削除する

問題は、私は私のプログラムを閉じたときに、発生する

quitButton{ 
     onClicked: { 
      application.close(); 
      Qt.quit() 
     } 
    } 

し、プログラムがクラッシュ

delete(instanceOfModelClass); 

にアクセス違反と。私はこのインスタンスのためにQObjectの親を設定しようとしましたが、エンジンのこのオブジェクトに対してQQmlEngine :: CppOwnershipを設定しましたが、それでも動作しません。

どのように問題を解決できますか?

P.S.私は削除を削除した場合(instanceOfModelClass);私は理解しているように、それはmeamoryリークがあります。

+0

親または「CppOwnership」を設定すると効果があります。問題を示す最小限の完全な例を提供できれば助けになります。代わりに、 'main()'で作成していると仮定して)代わりに 'instanceOfModelClass'をスタックに作成することもできます。 – Mitch

+0

モデルを作成するときに、以前に削除された可能性のある親を設定しますか? – derM

+0

**あなたのPSについて**:それはプラットフォームに依存します。 https://stackoverflow.com/questions/2975831/is-leaked-memory-freed-up-when-the-program-exits-多くのシステムでは問題はありませんが、私はそれをきれいにする良いスタイルだと考えていますアップ。次の人があなたのコードを実行するプラットフォームを知っている人。 – derM

答えて

0

QObjectsの親が設定されたときに問題は解決しました。コールを正しい順序で削除する。

-1

私はあなたのプログラムがクラッシュすると思うのは、ポインタが以前に他の場所で削除されているためです。ポインタはまだそれを削除する前に存在するかどうかをチェックしてみてください、あなたはそのような何かを行うことができます。

if (myPointer != nullptr) delete myPointer; 

もう一つの選択肢は、それがスコープの外に出たときに自動的にポインタを削除しますQScopedPointerを使用することです。私はあなたが主な関数にあなたのポインタを作成すると仮定します。そのようなもの:

QScopedPointer<MyClass> scp(new MyClass()); // no need to set a parent 
MyClass* myClassPtr = scp.data(); // use this one to pass it to the qml context. 
+0

これは、削除されたポインタに 'nullptr'をセットする必要はありませんか? – derM

+0

私は理解していない、私はちょうどポインタがまだそれを削除するために生きているかどうかを確認します。どこでnullptrに設定していますか? – mohabouje

+0

あなたがそれを削除した後、次回あなたがわからないときは、ポインタを削除するかどうかは、まだ生きているかどうかを確認することができます*。 'delete myPointer'を呼び出した後で、' myPointer == nullptr' - ** afaik ** – derM

関連する問題