2016-10-01 82 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

相关问题