需要手动删除QValidator吗?

时间:2015-01-22 22:19:23

标签: c++ qt memory-leaks

示例代码:

QDoubleValidator *validator = new QDoubleValidator();
myInputLineEdit->setValidator(validator);

// delete validator;

注意:myInputLineEdit是一个QLineEdit指针,将以其父级删除。

我的问题是,我什么时候应该删除验证器,因为它是手动创建的,并且setValidator()根据文档似乎没有获得此指针的所有权?如果我不删除它,它会是内存泄漏吗?

我试着删除它,就像注释代码一样,我注意到myInputLineEdit的验证器在此之后变为0。所以我想我可能需要在删除myInputLineEdit后删除它。

另一个想法是,我可以给验证员一个父母,因此它将与其parrent一起被删除,这是一个很好的方法吗?如果没有一个好的候选人成为父母会怎么样?

由于

2 个答案:

答案 0 :(得分:6)

  

我试图将其删除,就像注释代码一样,我   注意到myInputLineEdit的验证器在此之后变为0。所以我   我想可能需要在删除myInputLineEdit后删除它。

这是因为QLineEdit在内部使用了QPointer,如果它被删除则跟踪QValidator个对象。

  

和setValidator()似乎没有获得此指针的所有权   根据文件

setValidator()确实没有设置QValidator的父级。

  

另一个想法是,我可以给验证者一个父母,这样就可以了   与其parrent一起删除,这是一个很好的方法吗?如果   作为父母,没有一个好的候选人吗?

你可以手动删除它,使用智能指针或者像@crayzeewulf那样说 - 设置myInputLineEdit为父(使用QValidator构造函数或setParent())。父母负责删除其子女,所以这是一种方法。通常,分配给哪个验证器的对象是一个好父母。

  

如果我不删除它,那会是内存泄漏吗?

如果既没有设置父项也没有删除它,则会出现内存泄漏。

答案 1 :(得分:2)

使用mInputLineEdit作为parent的{​​{1}},如示例here中所示。父级的析构函数会破坏所有子对象(请参阅this)。这是处理ownership trees的“qt方式”。