LoginSignup
2
0

More than 5 years have passed since last update.

QObject のインスタンスを delete する時にわざわざ disconnect する必要は無い

Last updated at Posted at 2018-04-10

タイトルの通りですが、意外と書いていないので。

QObject (の派生クラス)のインスタンス obj1 を解放するとして、 delete の直前に obj1 に connect されたシグナル・スロットをわざわざ disconnect する必要はありません。

disconnect(obj1, シグナル, 別のオブジェクト, スロット);
disconnect(別のオブジェクト, シグナル, obj1, スロット);
// ↑ これを呼ぶ必要は無い!!!
delete obj1;

obj1 のコネクションはすべて QObject のデストラクタの中で解除されるからです。

QObject::~QObject()
All signals to and from the object are automatically disconnected, and any pending posted events for the object are removed from the event queue.

常識的に考えて、delete する前にユーザーがすべてのコネクションを調べて、それを明示的に解除する必要があるなんてバカな設計になっているはずがない(そもそも Qt はマルチスレッドを前提にしているので、競合を起こさずにそんなことをすることは不可能)のですが、初心者の方にはどうしてもそういう事をやってしまう人がいるようです。
やってもほとんどの場合※害はありませんが、何事も理屈を理解した上でプログラミングしましょう。
こういうコードを書く人は、Qt のシグナル・スロットの仕組みやマルチスレッドプログラミングの基本を十分理解せずにコーディングしている可能性が高いので、指導する立場にある方は十分注意してレビューしてください。

※害がある時とはどんな時でしょうか。考えてみましょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0