最近在看源码的时候,发现,好多的函数采用的是返回“指针”的方式。
如这个QChart的例子:
QChart *ThemeWidget::createPieChart() const
{
QChart *chart = new QChart();
chart->setTitle("Pie chart");
QPieSeries *series = new QPieSeries(chart);
for (const Data &data : m_dataTable[0]) {
QPieSlice *slice = series->append(data.second, data.first.y());
if (data == m_dataTable[0].first()) {
// Show the first slice exploded with label
slice->setLabelVisible();
slice->setExploded();
slice->setExplodeDistanceFactor(0.5);
}
}
series->setPieSize(0.4);
chart->addSeries(series);
return chart;
}
最开始看到这样使用的时候,我其实是充满着疑惑的,因为我想的是指针开辟之后如果不进行释放的话,可能会造成内存泄漏。那么那些大佬在写这个的时候,就没有想到这点吗?
后来,对于这个疑惑,我向我的同事进行了请教,才茅塞顿开。
造成内存泄漏的原因是“自由存储区中某一块内存的地址丢失了,找不到这块地址,然后进行了误操作”。
简单来说,释放指针,实际上释放的是“指针指向的那块地址空间”,在函数中定义的指针变量,注意是“变量”,也就是说这个指针变量是存放在“栈区”的,这个指针变量在函数执行结束的时候,会被程序自动释放。此时返回的实际上不是这个指针变量,而是其指向的内存地址。
也就是说,地址没丢,临时的指针变量正常消失,根本不会造成我原先想的那种内存泄漏的情况。
总结:
对于这个问题,我的薄弱点在于,没有彻底理解指针,指针本身是一个“变量”,指针指向的值才是“自由存储区中的地址”。只要这块地址不丢失,指针变量几遍消失了,也不会造成内存泄漏的情况。