重置QValidator泄漏内存吗?

时间:2014-12-02 19:07:59

标签: c++ qt memory-leaks

我很好奇是否有人知道通过将其重置为零来删除QValidator是否会泄漏内存。 QT Documentation提到验证器已被删除",但这是否也意味着它已被删除?

我的意思的一个例子......

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

// .... use the line edit

edit.setValidator(0);

2 个答案:

答案 0 :(得分:3)

不,0不会删除validator,只会从validator删除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();

(const_cast<QValidator *>(ui->lineEdit->validator()))->deleteLater();
//here we just does not create unnecessary QValidator *vaal

其中Validator是一个子类:

Validator::~Validator()
{
   qDebug() <<"~Validator";
}

输出是:

~Validator 

或者只使用:

Validator *vaal = new Validator;
ui->lineEdit->setValidator(vaal);
ui->lineEdit->setValidator(0);
vaal->deleteLater();

输出相同。

此外,当您使用setValidator QLineEdit时,不会拥有此validator的所有权。见下一个代码:

ui->lineEdit->setValidator(new QIntValidator(0,100,this));
qDebug() << ui->lineEdit->validator()->parent();

我的情况输出:MainWindow(0x28fdc8, name = "MainWindow")正如您所看到的那样,它不是lineEdit

ui->lineEdit->setValidator(new QIntValidator(0,100));
qDebug() << ui->lineEdit->validator()->parent();

输出为:QObject(0x0)

删除validator只是您的责任。

答案 1 :(得分:0)

只需设置验证器的父级,e。 G:

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

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