2014-09-30 129 views
0

我已經注意到在QT 5中沒有刪除調用新的小部件分配。QT中的免費動態分配內存

這是否意味着在這個例子中

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(); 

} 

不需要刪除調用或它的地方是哪裏呢?

感謝

+1

可能重複的[內存管理在Qt?](http://stackoverflow.com/questions/2491707/memory-management-in-qt) – MrEricSir 2014-09-30 05:30:15

+0

@MrEricSir該問題的答案不包括分配在堆棧中的QObjects,這是'w'的情況。 – hyde 2014-10-06 17:26:05

回答

2

如果你真的想這樣做,在您的代碼段,你應該把應用程序事件循環結束後刪除:

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

Object trees and ownership reference here

+0

我想堆,因爲會有太多的數組需要是全局的,他們的總大小會使堆棧太大 – Hatems 2014-09-30 05:32:33

+0

@Hatems,它似乎當你靜態分配你的變量(在我的答案AA被定義爲全局靜態數組)他們肯定沒有存儲在堆棧中。檢查這個答案http://stackoverflow.com/a/11698458/2266412 – 2014-09-30 05:53:34

+0

感謝您的更新。我同意全局靜態變量不在堆棧中。好的提醒 – Hatems 2014-09-30 06:33:18

0

在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! 
} 

然而,堆棧空間可以比堆空間較爲有限,如此巨大的結構通常被分配在堆上。

+0

感謝您的解釋。 – Hatems 2014-09-30 05:33:46