簡體   English   中英

在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 現在, myWidget實例將在刪除其父小部件時自動銷毀,這就是為什么我們不需要為此實例顯式調用delete的原因。

對象樹和所有權參考在這里

在Java中,所有對象變量實際上都是對象引用,有點類似於C ++指針。 在C ++中,對象也可以分配在堆棧上(如代碼中的MyTabDialog w )。 它不是一個統一的指針( 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!
}

但是,堆棧空間可能比堆空間更受限制,因此通常在堆上分配巨大的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM