QTabWidget

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への理解が足りないのかそれらしい記述が見えん。
謎す。