示例代码:
QDoubleValidator *validator = new QDoubleValidator();
myInputLineEdit->setValidator(validator);
// delete validator;
注意:myInputLineEdit是一个QLineEdit指针,将以其父级删除。
我的问题是,我什么时候应该删除验证器,因为它是手动创建的,并且setValidator()根据文档似乎没有获得此指针的所有权?如果我不删除它,它会是内存泄漏吗?
我试着删除它,就像注释代码一样,我注意到myInputLineEdit的验证器在此之后变为0。所以我想我可能需要在删除myInputLineEdit后删除它。
另一个想法是,我可以给验证员一个父母,因此它将与其parrent一起被删除,这是一个很好的方法吗?如果没有一个好的候选人成为父母会怎么样?
由于
答案 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方式”。