当一个类被删除时,Qt中的信号是否会自动断开连接?

58

Qt是否会自动删除对象之间的连接,当其中一方被删除时?

例如connect(A.. , B..),当A (一个指针)被删除或B被删除时,连接是否会断开?

在析构函数中明确使用disconnect是否是必要的?

1个回答

58
是的,QObject::~QObject 析构函数会自动处理这些问题:
所有与该对象有关的信号都会自动断开连接,以及从事件队列中删除任何待处理的事件。 但是,直接删除 QObject 子类通常不太安全,最好使用deleteLater()
然而,需要注意的是: 警告:如果存在等待交付的事件,删除 QObject 可能会导致崩溃。如果 QObject 存在于与当前执行线程不同的线程中,则不能直接删除它。请使用 deleteLater(),它将在所有待处理事件被交付给对象后,由事件循环删除此对象。

10
在删除对象时,如果使用了lambda,请注意它们并没有断开连接...你猜我是怎么知道的 ;) - mBardos
在Qt5中也是如此。 - RegularlyScheduledProgramming
6
自Qt 5.2以来,有一个重载函数可以接受上下文对象作为参数。当上下文对象被删除时,与lambda的连接也会被断开。 - Zitrax
@定期编程 我仍然在使用5.1.1,但我可以说一件事:它是必需的!;) - mBardos
1
@JohannesSchaub-litb,很可能不会出现这种情况。我能够使用Valgrind检测到一些崩溃。如果一个对象被标记为 deleteLater(),并且在执行之前,如果从另一个线程排队了任何新信号,则会导致未定义的行为。根据操作系统的不同,有时会在随机位置崩溃。这种错误很难追踪 :-( - iammilind
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接