2009-03-22 8 views
1

私は現在、Qt、OpenCv、Mac OS Xでプログラムを作成しています。私はメインウィンドウと別のウィンドウを開いています。私は、コンストラクタで新しいウィンドウいくつかの行列のクローンを渡します。新しいウィンドウが閉じられたときに、私は、(私はcvReleaseMat呼ぶのですかどこ)割当てを解除するにはどうすればよいQtウィンドウが閉じたときにメモリの割り当てを解除するには?

ImageWindow *imageWin = new ImageWindow( 
    cvCloneMat(getData->getMasterRawMat(1)), 
    cvCloneMat(getData->getMasterRawMat(2)), 
    cvCloneMat(getData->getMasterRawMat(3)), 
    cvCloneMat(getData->getMasterRawMat(4))); 
imageWin->show(); 

答えて

8

あなたはそうすることができます。あなたのcloseEvent()あるいは、widget attributesQt::WA_DeleteOnCloseを使用すると、ウィジェットは閉じられたときに削除されます。つまり、デストラクタにいくつかのクリーンアップルーチンを置くことができます。

+0

コメント: 'ImageWindow * imageWin'を正しく親にしてください。メモリ管理のためにQTで重要な役割を果たす適切な子育て:) – bgs

+0

'Qt :: WA_DeleteOnClose'フラグを' QWidget'に追加すると、閉じるボタンを押して閉じると、関連付けられたメモリが割り当て解除されますか? 'QTableWidget * w = new QTableWidget();'のように初期化しています。 – SexyBeast

1

RAII idiomsmart pointersを使用することを検討してください。割り当てられたメモリを解放する必要はありません。

+0

ウィンドウを閉じることは!=ウィンドウを削除することです。スマートポインタはここでは役立たない。 – ypnos

+0

現在のケースでは、closeEvent()でデータが解放され、ウィンドウが後で再利用されると、クローン行列にアクセスしようとするとUBが発生します。なぜなら、それらはウィンドウコンストラクタに割り当てられているからです。コンストラクタで割り当てられたものは、これを含めて99%のケースでデストラクタで削除する必要があります。 – Paul

+0

私が言いたいのは、質問はウィンドウを閉じて破壊を引き起こす方法だったということです。破壊自体をより簡単に、よりスマートに、あるいは何にしても、どうやって破壊するのかについてではありませんでした。 – ypnos

関連する問題