【问题标题】:Need to delete QValidator manually?需要手动删除 QValidator?
【发布时间】:2015-03-21 21:22:24
【问题描述】:

示例代码:

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

// delete validator;

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

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

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

另一个想法是,我可以给验证器一个父节点,这样它就会和它的父节点一起被删除,这是一个好方法吗?如果没有合适的家长候选人怎么办?

谢谢

【问题讨论】:

  • 如果您对setValidator 不拥有所有权的原因感兴趣:这可能是因为您可以对多个输入小部件使用相同的验证器,所以它有点共享 i> 所有权。但是 QObjects 没有共享所有权,而是 unique 父所有权,因此您需要将父级设置为 some 小部件(行编辑或它的父级,任何最有意义的)。

标签: c++ qt memory-leaks


【解决方案1】:

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

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

并且 setValidator() 似乎没有获得这个指针的所有权 根据文档

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

另一个想法是,我可以给验证器一个父级,这样它就可以了 连同它的父母一起被删除,这是一个好方法吗?如果 没有合适的人选做家长吗?

您可以手动删除它,使用智能指针或像@crayzeewulf 所说的那样 - 将myInputLineEdit 设置为父级(使用QValidator 构造函数或setParent())。父母需要注意删除它的孩子,所以这是一种方法。通常分配验证器的对象是一个好的父对象。

不删除会不会是内存泄露?

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

【讨论】:

  • 谢谢大家。正如@leemes 所提到的,我没有使用 myInputLineEdit 作为父级,因为我想将此验证器用于几个 QLineEdit 对象。因此,当其中一个被删除时,就会出现问题。我想我在这里有两个选择:1,为每个 QLineEdit 创建一个验证器; 2、由于所有这些QLineEdit对象都是一个公共类的成员,这个类也是一个QObject类,我可以把它作为父类。
  • @Leo Go 使用选项 2。
【解决方案2】:

使用mInputLineEdit 作为validatorparent,如示例here 中所示。父对象的析构函数会销毁所有子对象(参见this)。这是处理ownership trees的“qt方式”。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 2012-08-02
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    相关资源
    最近更新 更多