在QT中释放动态分配的内存
free dynamically allocated memory in QT
我注意到在QT 5示例中,没有为分配的新小部件进行删除调用。
这是否意味着在这个例子中
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();
}
不需要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);
在上面的例子中,this
是指向另一个QObject实例的指针,该实例现在是myWidget
的父实例。现在myWidget
实例将在删除其父窗口小部件时自动销毁,这就是为什么我们不需要为该实例显式调用delete
。
此处为对象树和所有权参考。
在Java中,所有对象变量实际上都是对象引用,有点类似于C++指针。在C++中,对象也可以在堆栈上分配(如代码中的MyTabDialog w
)。它不是一个统一的指针(MyTabDialog *w
应该是)。它是使用其无参数构造函数创建并使用其析构函数处理的初始化对象。
因此,在您的示例中没有对变量w
的delete调用。
分配和不删除堆栈上的数组的方式相同:
int main(int argc, char *argv[])
{
short AA[1000000];
// no delete is required to free AA, beware never to return pointer to it!
}
然而,堆栈空间可能比堆空间更有限,因此通常在堆上分配巨大的结构。
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存
- 销毁C++中动态分配的内存(数组对象)
- 删除类成员的动态分配内存的最佳方法是什么
- 动态分配的内存构造函数
- 为什么动态分配的内存总是16字节对齐
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为浮点数组动态分配内存
- 动态分配 8 字节的内存
- 包含动态分配内存作为值的映射的取消定位速度有多快?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 在C 中动态分配的内存的问题
- 为什么在 C++ 执行删除操作后仍可以访问释放的动态分配的内存
- 对内存动态分配的类不使用"*"的逻辑
- 如果我将内存动态分配给静态变量,我应该释放它还是会自动释放它