QList清除函数调用是否清除了存储在QList中的动态分配对象的内存?

时间:2016-08-24 13:00:23

标签: c++ qt dynamic-memory-allocation

所以我有一个叫AppointmentSchedule的类,它有以下类型:

namespace Ui {
class AppointmentSchedule;
}

class AppointmentSchedule : public QWidget
{
    Q_OBJECT

public:
    explicit AppointmentSchedule(QWidget *parent = 0);
    ~AppointmentSchedule();
    Ui::AppointmentSchedule *ui;
};

此类的ui由两个类型为QLabel的对象和两个类型为QDateTimeEdit的对象组成。在外部类中,我需要QList动态分配的AppointmentSchedule类型的对象。我将在QList中附加动态分配的对象,类似于以下方式。

QList<AppointmentSchedule*> scheduleList;

foreach (QDate date, dates)
{
     AppointmentSchedule * newSchedule = new AppointmentSchedule(this);//Allocation of memory
     QDateTime sDateTime(date, QTime(8, 0, 0));
     newSchedule->ui->appointmentStartDateTimeEdit->setDateTime(sDateTime);
     QDateTime eDateTime(date, QTime(8, 15, 0));
     newSchedule->ui->appointmentEndDateTimeEdit->setDateTime(eDateTime);
     scheduleList.append(newSchedule);
}

如果我这样调用clear()的{​​{1}}函数:

QList

它会释放我分配的所有内存吗?

感谢。

3 个答案:

答案 0 :(得分:2)

  

它会释放我分配的所有内存吗?

不,clear()仅从列表中删除所有项目。在您的情况下,这些项目是AppointmentSchedule个对象的指针。

在为AppointmentSchedule个对象设置父对象时,将删除其父对象时删除此对象。这就是为什么你的情况下没有内存泄漏。

答案 1 :(得分:1)

  

它会释放我分配的所有内存吗?

没有。您向AppointmentSchedule对象声明了指针的列表。当你调用clear时,这些指针将被删除,但是它们指向的内存将保持不变,因此你会得到内存泄漏。

要取消分配对象本身,请使用智能指针(如std::unique_ptrstd::shared_ptr)或在调用foreach之前以任何类型的clear()循环手动删除它们。< / p>

编辑:

在这种情况下,没有内存泄漏,因为Qt对象层次结构将负责正确的对象破坏。见@ Kirill的答案。

答案 2 :(得分:0)

因为你使用指针: 为避免内存泄漏,您需要删除每个指针,例如:

foreach(auto element, scheduleList)
{
    delete element;
}

此外,如果您在AppointmentSchedule元素中使用父属性,则在删除父级时会自动删除它们。

关于列表本身: 如果您想在列表中存储大对象(而不是指针),则调用.clear()仅删除可访问的项目,但不一定要调整容器的大小。如果每次调用它都会这样做,效率会很低。

但是,您可以调用.squeeze()来释放未使用的内存。 它仍然只删除为指针分配的空间,而不是用new运算符分配的堆上的对象。