Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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++ 在QT中释放动态分配的内存_C++_Qt - Fatal编程技术网

C++ 在QT中释放动态分配的内存

C++ 在QT中释放动态分配的内存,c++,qt,C++,Qt,我注意到在Qt5示例中,对于分配的新小部件没有删除调用 在这个例子中这意味着什么 using namespace std; #include <QApplication> #include <QMainWindow> #include <QTabWidget> //This is to be used in many files later until the code exits short * AA = new short[1000000]; i

我注意到在Qt5示例中,对于分配的新小部件没有删除调用

在这个例子中这意味着什么

using namespace std;

#include <QApplication>
#include <QMainWindow>
#include <QTabWidget>


//This is to be used in many files later until the code exits
short * AA = new short[1000000];


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyTabDialog w;
    w.show();


    delete[] AA;  
    return app.exec();

}
使用名称空间std;
#包括
#包括
#包括
//这将在以后的许多文件中使用,直到代码退出
短线*AA=新短线[1000000];
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
MyTabW;
w、 show();
删除[]AA;
返回app.exec();
}
不需要删除调用或其位置错误


谢谢

如果您真的想在代码段中执行此操作,您应该在应用程序事件循环完成后放置delete:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyTabDialog w;
    w.show();


    int result = app.exec();
    delete[] AA;
    return result;
}
但是为什么要从堆中分配AA呢?您可以将其定义为以下内容:

short AA[1000000];
在Qt示例中,小部件通常是动态创建的,例如:

QWidget* myWidget = new QWidget(this);
在上面的示例中,
这个
是指向另一个QObject实例的指针,它现在是
myWidget
的父对象。现在,
myWidget
实例将在删除其父小部件时自动销毁,这就是为什么我们不需要为此实例显式调用
delete


在爪哇中,所有的对象变量实际上是对象引用,与C++指针有些相似。在C++中,对象也可以在堆栈上分配(例如在代码中使用<代码> MyTabCudioW)。它不是一个统一的指针(
MyTabDialog*w
将是)。它是使用其无参数构造函数创建并使用其析构函数处理的初始化对象

因此,您的示例中没有对变量
w
的删除调用

同样,可以在堆栈上分配而不删除数组:

int main(int argc, char *argv[])
{
    short AA[1000000];
    // no delete is required to free AA, beware never to return pointer to it!
}

但是,堆栈空间可能比堆空间更有限,因此通常在堆上分配大型结构

@MrEricSir的可能副本该问题的答案不包括在堆栈中分配的QoObject,这是
w
的情况。我想要在堆上,因为需要太多全局数组,它们的总大小也会使堆栈变大big@Hatems,似乎是在静态分配变量时(在我的回答中,AA被定义为全局静态数组)它们肯定没有存储在堆栈上。检查此回答感谢更新。我同意全局静态变量不在堆栈中。很好的提醒