繁体   English   中英

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

[英]Does QList clear function call clears the memories of dynamically allocated objects that are stored in the QList?

所以我有一个名为AppointmentSchedule类,它有以下类型:

namespace Ui {
class AppointmentSchedule;
}

class AppointmentSchedule : public QWidget
{
    Q_OBJECT

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

ui该类组成类型的两个对象的QLabel和类型的两个对象QDateTimeEdit 在外部类中,我需要一个动态分配的AppointmentSchedule对象的QList 我将在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);
}

如果我像这样调用QListclear()函数:

scheduleList.clear();

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

谢谢。

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

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

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

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

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

要释放对象本身,请使用智能指针(如std::unique_ptrstd::shared_ptr )或在调用clear()之前在任何类型的foreach循环中手动删除它们。

编辑:

在这种情况下,没有内存泄漏,因为Qt对象层次结构将负责正确的对象销毁。 请参阅@Kirill的回答。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM