Qt中指针new和默认构造函数有什么区别?
What's the different between pointer new and default constructor in Qt?
我是 Qt 和 C++ 的新手。我的感受如下:
//1
widget a;
a.show();
//2
widget *b=new widget();
b->show();
而且我记得小部件 class(继承自 QWidget)具有默认构造函数。但是如果我在按钮中使用它,例如:
void MainWindow::on_pushButton_clicked()
{
//widget v;
//v.show();
widget *v=new widget();
v->show();
}
第一个在 10 毫秒后关闭。是什么导致它们之间的差异?
更新:
我提出这个问题是因为在 qt main 中创建 windows 最流行的方法是:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
它可以工作。 .exec()
是一个无限循环。所以我想知道为什么它不能正常工作...
这是因为在第一个片段中,对象被放置在堆栈中,所以一旦超出范围就会被销毁。
new
关键字将它放在堆上。这意味着它将一直存在,直到您再次 delete
或退出应用程序。所以你必须考虑这一点,因为如果你不确保你的对象被删除,你就会发生内存泄漏。
现在有很多智能指针(也来自 Qt)可以为您删除对象。
Qt 还会删除被删除对象的子对象,这也可以帮助您管理内存。
这是需要理解的非常重要的 c++ 部分,因此您不应该尝试从 Whosebug 答案中学习所有内容:)
在不了解你的应用程序的情况下,我猜这里对你来说最好的选择是,将小部件添加为主 window 的成员变量,然后调用 [=12= 】 需要的时候。
这意味着它与MainWindow同时构建。
我是 Qt 和 C++ 的新手。我的感受如下:
//1
widget a;
a.show();
//2
widget *b=new widget();
b->show();
而且我记得小部件 class(继承自 QWidget)具有默认构造函数。但是如果我在按钮中使用它,例如:
void MainWindow::on_pushButton_clicked()
{
//widget v;
//v.show();
widget *v=new widget();
v->show();
}
第一个在 10 毫秒后关闭。是什么导致它们之间的差异?
更新:
我提出这个问题是因为在 qt main 中创建 windows 最流行的方法是:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
它可以工作。 .exec()
是一个无限循环。所以我想知道为什么它不能正常工作...
这是因为在第一个片段中,对象被放置在堆栈中,所以一旦超出范围就会被销毁。
new
关键字将它放在堆上。这意味着它将一直存在,直到您再次 delete
或退出应用程序。所以你必须考虑这一点,因为如果你不确保你的对象被删除,你就会发生内存泄漏。
现在有很多智能指针(也来自 Qt)可以为您删除对象。 Qt 还会删除被删除对象的子对象,这也可以帮助您管理内存。
这是需要理解的非常重要的 c++ 部分,因此您不应该尝试从 Whosebug 答案中学习所有内容:)
在不了解你的应用程序的情况下,我猜这里对你来说最好的选择是,将小部件添加为主 window 的成员变量,然后调用 [=12= 】 需要的时候。 这意味着它与MainWindow同时构建。