如何释放内存?

Posted

技术标签:

【中文标题】如何释放内存?【英文标题】:How to release memory? 【发布时间】:2018-12-31 20:33:38 【问题描述】:

我为我的大学作业创建了一个简单的 QT 申请。我所做的是从上面的 QMainWindow 中弹出一个新的 QManinWindow。当我从主用户界面单击一个按钮时,它将弹出一个新的 QMainWindow 对象(记事本)

记事本也是一个QMainWindow对象

我的问题是当我创建对象时,它会从内存中占用一些内存,但是当我关闭它(弹出窗口)时,内存没有释放。当我每次按下按钮时都会分配内存但应用程序在关闭它时不会释放内存。请检查应用程序的主屏幕。

我只想知道如何释放那段记忆。我尝试了很多东西,但都没有奏效。

我已经在记事本类上设置了 closeEvent public,当它被触发时,我从主对象监听关闭事件,我删除了弹出的对象。但它会导致广告意外停止。

void MainWindow::on_notePadBtn_clicked()


    NotePad *notePad = new NotePad(this);
    notePad->raise();
    notePad->activateWindow();
    notePad->show();



NotePad::NotePad(QWidget *parent) :QMainWindow(parent),ui(new Ui::NotePad) 

    ui->setupUi(this);
    this->setWindowTitle("Note Pad");

【问题讨论】:

在closeEvent中,你应该使用notePad->deleteLater()而不是delete notePad 【参考方案1】:

你真的不需要重写closeEvent,Qt 有Qt::WA_DeleteOnClose 属性,这正是你想要的,你可以像这样使用它:

//...
NotePad *notePad = new NotePad(this);
notePad->setAttribute(Qt::WA_DeleteOnClose);
notePad->raise();
notePad->activateWindow();
notePad->show();
//...

【讨论】:

【参考方案2】:

我不熟悉 Qt。

但据我了解,如果您使用运算符 new 您必须使用delete(在您可以访问使用 new 创建的指针的范围内)。

Object *foo = new Object();
// Do stuff with foo...
delete foo;
// DO NOT use foo from now on. 

希望能有所帮助,也许吧。就像我说的我不熟悉 Qt 因此,如果您对某些功能的实现方式有疑问,您应该查看他们的文档。

(参见:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf §3.7.4p63)

【讨论】:

这个答案无济于事。您不想删除 on_notePadBtn_clicked() 函数中的窗口对象,因为这将在您希望它关闭之前。 嗯。我很高兴你提到这一点。在 C++ 中,使用 new 时使用 delete。就像我说的我不熟悉 Qt,但如果它让你使用 new 而不删除,那就太糟糕了。如果他们有自定义功能来处理它,有很多方法可以避免让用户这样做。我不明白。反正。谢谢指正

以上是关于如何释放内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何释放手机内存 清理释放安卓手机内存空间方法

linux何时自动释放内存

怎样释放内存,释放内存有啥作用?对电脑有伤害吗?

解析PHP中的内存管理,PHP动态分配和释放内存

如何清理释放Android手机内存空间

怎么能释放手机内存