Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要手动删除QValidator吗?_C++_Qt_Memory Leaks - Fatal编程技术网

C++ 需要手动删除QValidator吗?

C++ 需要手动删除QValidator吗?,c++,qt,memory-leaks,C++,Qt,Memory Leaks,示例代码: QDoubleValidator *validator = new QDoubleValidator(); myInputLineEdit->setValidator(validator); // delete validator; 注意:myInputLineEdit是QLineEdit指针,将与其父项一起删除 我的问题是,我应该在什么时候删除validator,因为它是手动创建的,并且根据文档,setValidator()似乎不拥有该指针的所有权?如果我不删除它,会不会

示例代码:

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

// delete validator;
注意:myInputLineEdit是QLineEdit指针,将与其父项一起删除

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

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

另一个想法是,我可以给验证器一个父对象,这样它就会和它的parent一起被删除,这是一个好方法吗?如果没有一个好的候选人做父母呢


感谢使用
mInputLineEdit
作为
验证器的
父级
,如示例所示。父对象的析构函数将销毁所有子对象(请参见)。这是处理的“qt方式”

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

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

而且setValidator()似乎不拥有这个指针 根据文件

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

另一个想法是,我可以给验证器一个家长,这样它就可以 连同它的部分一起删除,这是一个好方法吗?如果…怎么办 没有一个好的候选人来做父母

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

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


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

如果您对
setValidator
不拥有所有权的原因感兴趣:这可能是因为您可以对多个输入小部件使用同一个验证器,所以这是一种共享所有权。但是QoObject没有共享的所有权,而是唯一的父所有权,所以您需要将父控件设置为某个小部件(行编辑或它的父控件,任何有意义的)。谢谢大家。我没有使用myInputLineEdit作为父对象,因为我想对几个QLineEdit对象使用这个验证器,正如@leems所提到的。因此,当其中一个被删除时就会出现问题。我想我有两个选择:1,为每个QLineEdit创建一个验证器;2,因为所有这些QLineEdit对象都是一个公共类的成员,该类也是QObject类,所以我可以将其用作父类。@Leo请选择选项2。