2016-10-01 70 views
2

我一直在檢查Qt BarChart示例,我注意到動態分配的變量根本沒有被刪除,爲什麼?我嘗試複製此示例的想法,然後在佈局中使用,並在plainTextEditor中顯示圖表。但是,我想在顯示圖表後刪除這些動態分配的變量,但我不知道何時何地刪除它們。我試圖在函數結尾刪除它們,但它不會在plainTextEditor上顯示任何內容。我不想將這些動態分配的變量定義爲成員變量,並在析構函數中刪除它們。爲什麼Qt圖表示例不會刪除動態分配的變量

下面是我從Qt文檔

> #include <QtWidgets/QApplication> 
> #include <QtWidgets/QMainWindow> 
> #include <QtCharts/QChartView> 
> #include <QtCharts/QBarSeries> 
> #include <QtCharts/QBarSet> 
> #include <QtCharts/QLegend> 
> #include <QtCharts/QBarCategoryAxis> 
> 
> QT_CHARTS_USE_NAMESPACE 
> 
> int main(int argc, char *argv[]) { 
>  QApplication a(argc, argv); 
> 
>  QBarSet *set0 = new QBarSet("Jane"); 
>  QBarSet *set1 = new QBarSet("John"); 
>  QBarSet *set2 = new QBarSet("Axel"); 
>  QBarSet *set3 = new QBarSet("Mary"); 
>  QBarSet *set4 = new QBarSet("Samantha"); 
> 
>  *set0 << 1 << 2 << 3 << 4 << 5 << 6; 
>  *set1 << 5 << 0 << 0 << 4 << 0 << 7; 
>  *set2 << 3 << 5 << 8 << 13 << 8 << 5; 
>  *set3 << 5 << 6 << 7 << 3 << 4 << 5; 
>  *set4 << 9 << 7 << 5 << 3 << 1 << 2; 
> 
>  QBarSeries *series = new QBarSeries(); 
>  series->append(set0); 
>  series->append(set1); 
>  series->append(set2); 
>  series->append(set3); 
>  series->append(set4); 
> 
> 
>  QChart *chart = new QChart(); 
>  chart->addSeries(series); 
>  chart->setTitle("Simple barchart example"); 
>  chart->setAnimationOptions(QChart::SeriesAnimations); 
> 
>  QStringList categories; 
>  categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; 
>  QBarCategoryAxis *axis = new QBarCategoryAxis(); 
>  axis->append(categories); 
>  chart->createDefaultAxes(); 
>  chart->setAxisX(axis, series); 
> 
>  chart->legend()->setVisible(true); 
>  chart->legend()->setAlignment(Qt::AlignBottom); 
> 
>  QChartView *chartView = new QChartView(chart); 
>  chartView->setRenderHint(QPainter::Antialiasing); 
> 
>  QMainWindow window; 
>  window.setCentralWidget(chartView); 
>  window.resize(420, 300); 
>  window.show(); 
> 
>  return a.exec(); } 
+0

沒有人對這個問題感興趣? – Vito

回答

2

在Qt得到例如,某些功能被指定到取得所有權,形成了父/子關係。父母在被摧毀時會將其子女刪除。

對於您所示的示例,seriesset0set4(從調用到series->append)的父項。 chartaxisseries(來自chart->setAxisX)的父項。 chartViewchart的母公司(來自其構建:QChartView *chartView = new QChartView(chart))。最後windowchartView的母公司(從window.setCentralWidget)。並且由於window不是指針,而是具有自動存儲持續時間的實際對象,因此它將在範圍末尾銷燬,並將其所有後代與它一起銷燬。

+0

正如我在問題中提到的那樣,如果我使用此代碼在另一個窗口小部件(QplainTextEditor)中顯示圖表,並且基於不同的數據源多次調用它,在我退出整個應用程序之前,這會是內存泄漏嗎? – Vito

+0

@Vito:只要每個動態分配的對象都有一個父對象,並且任何沒有父對象的對象不是動態分配的(就像上面例子中的'window'),就不會有內存泄漏,或者它是手動刪除。 –

+0

非常感謝您的回答。我很感激。 – Vito