QTabWidgetを使ってタブへWidgetを登録する時、"QTabWidget::addTab(QWidget *widget)"を使うけど、
逆に任意のタブを削除する時は、"QTabWidget::removeTab(int index)"を使う
しかし以下の手順でWidgetの、登録、削除すると、メモリリークが発生した。
addTab(new MyWidget(this));
/* 色々操作したりした後、タブを削除する */
removeTab(index); // タブは削除されるけど、widgetのメモリは開放されない!
こうなると、ポインタを知る術がなくなってしまうので、
プログラムを終了するまでWidgetに使われているメモリが開放されなくなる。
Qt Assistant調べてみると、
void QTabWidget::removeTab ( int index )
Removes the tab at position index from this stack of widgets. The page widget itself is not deleted.See also addTab() and insertTab().
excite翻訳で読むと、removeTabをしてもWidget自身は削除されないとの事。
なので、newしたらdeleteしないといけません。
で、widgetのポインタを受け取って、removeTabして、ポインタをdeleteとすると、
タブからも削除されるし、メモリリークも起きなかったわけですが、
もっとスマートに実装できないのかな、と思ったんですが、
removeTabを使わないで、以下の方法でやっても意図したとおりの動作が行われました。
delete widget(index);
これだけで上の3ステップと同様な効果が得られました。
でも実際に処理しているのは、任意のwidgetのdeleteだけであって、
QTabWidget自身の操作をしているわけではないのに、こんな処理をして大丈夫なんだろうか。
だってQTabWidgetは既にdeleteされているwidgetのポインタを持ったままなのでは。
QTabWidgetはそのwidgetがdeleteされているかどうかはわからないと思うんだけど。
でもdelete前と後でcountを呼び出してもしっかり1つだけ減ってるし。
謎す。
ソースコードをみてみたけど、内部でQStackedWidgetを使ってWidgetの管理をしている。
QWidgetをdeleteしたときに何らかの方法で、このstackからwidgetを取り除かないと、
countの減少が起きないとはずなんだけど。
でもコードを読み解く力がないからかQtへの理解が足りないのかそれらしい記述が見えん。
謎す。