C++ 重置QValidator是否会泄漏内存?

C++ 重置QValidator是否会泄漏内存?,c++,qt,memory-leaks,C++,Qt,Memory Leaks,我很好奇是否有人知道通过将QValidator重置为零来删除它是否会泄漏内存。上面提到验证器被“删除”,但这是否也意味着它被删除了 我的意思的一个例子 QLineEdit edit; edit.setValidator(new QIntValidator(0,100)); // .... use the line edit edit.setValidator(0); 否,0不会删除验证程序,只会从lineEdit中删除验证程序。如果你还想用 edit.setValidator(new QI

我很好奇是否有人知道通过将
QValidator
重置为零来删除它是否会泄漏内存。上面提到验证器被“删除”,但这是否也意味着它被删除了

我的意思的一个例子

QLineEdit edit;
edit.setValidator(new QIntValidator(0,100));

// .... use the line edit

edit.setValidator(0);

否,
0
不会删除
验证程序
,只会从
lineEdit
中删除
验证程序
。如果你还想用

edit.setValidator(new QIntValidator(0,100));
然后,您可以使用以下命令将其删除:

ui->lineEdit->setValidator(new Validator);
QValidator *vaal = const_cast<QValidator *>(ui->lineEdit->validator());//validator returns const, we use const_cast to avoid problems
vaal->deleteLater();
输出为:

~Validator 
或者只使用:

Validator *vaal = new Validator;
ui->lineEdit->setValidator(vaal);
ui->lineEdit->setValidator(0);
vaal->deleteLater();
输出是相同的

另外,当您使用
setValidator
QLineEdit
时,不会拥有此
验证程序的所有权。请参见下一代码:

ui->lineEdit->setValidator(new QIntValidator(0,100,this));
qDebug() << ui->lineEdit->validator()->parent();
输出为:
QObject(0x0)


删除
验证器
仅由您负责。

只需设置验证器的父级,即。g、 :

QLineEdit edit;
edit.setValidator(new QIntValidator(0,100,&edit));

在这种情况下,QLineEdit的析构函数将删除验证器。

请记住,父对象将保留子QObject的列表,当父对象被销毁时,它将释放其子对象。我希望QIntValidator是QLineEdit的孩子@drescherjm似乎不正确,请看我的答案,我补充了解释,lineEdit不拥有所有权。@Chernobyl似乎你是正确的。下面是Qt-4.8.6的内部结构:
void setValidator(const QValidator*v){m_validator=const_cast(v);}
这来自文件:qlinecontrol\p。h@drescherjm我看到了这个,只是没有把它添加到答案中,我添加了代码和输出的示例,我认为这足以证明这一点。@drescherjm我认为它不拥有验证器的所有权,因为它允许您通过多个小部件使用单个验证器实例
将删除带有新密码的验证程序?在这种情况下没有内存泄漏?也许,最好是
ui->lineEdit->setValidator(新的QIntValidator(0100,ui->lineEdit))
还是没关系?@Oleksandra您需要阅读Qt中的父子关系。如果使用Qt Designer,则lineEdit的父级是centralWidget,其父级是“this”。因此,这和lineEdit无关,对于干净的代码,请使用“this”。关于泄漏:这个验证器将被“this”删除(例如MainWindow类)。若您需要提前取消分配内存,那个么您应该自己删除验证器
ui->lineEdit->setValidator(new QIntValidator(0,100,this));
qDebug() << ui->lineEdit->validator()->parent();
ui->lineEdit->setValidator(new QIntValidator(0,100));
qDebug() << ui->lineEdit->validator()->parent();
QLineEdit edit;
edit.setValidator(new QIntValidator(0,100,&edit));