我可以调用删除计时器吗
如果您明确调用
delete timer
,QTimer的析构函数(确切地说,是QTimer QObject基类的析构因子)将从其父对象的子列表中删除QTimer,这样以后当调用父对象自己的析构符时,QTimeer就不会被第二次删除。所以没关系。
例如在unique_ptr的析构函数中
具有
unique_ptr
(或
shared_ptr
),OTOH,你会遇到一个问题——虽然QObject类足够聪明,可以在它们被破坏时更新它们的父QObject,但它们确实这样做了
不
知道如何更新
unique_ptr
或
shared_ptr
这指向了他们。所以如果你分配一个
unique_ptr
或
shared_ptr
指向您的QTimer对象,并为QTimer提供非NULL父对象(如您的示例中所示),那么您可能
将
存在双重删除问题:一次是当Qt机制删除QTimer时,第二次是当
unique_ptr
尝试删除它所包含的(现在悬空的)指针。(请注意,有一个
QPointer
类,其表现为指向QObject的弱指针,这可能很有用)。
正因为如此,最好不要尝试混合使用Qt的对象树系统和C++智能指针。也就是说,如果你要给你的QTimer一个非NULL的父级,那么你应该依靠这个父级来处理QTimer的删除,而不是试图用
unique_ptr
.
如果在堆栈上分配了计时器怎么办?这个知道吗?
不
this
的析构函数不知道对象在堆栈上,因此它将尝试删除它,从而导致未定义的行为。因此,如果要在堆栈上分配QTimer,则不应为其指定非NULL父指针。