[英]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);
}
如果我像这样调用QList
的clear()
函数:
scheduleList.clear();
它会释放我分配的所有内存吗?
谢谢。
它会释放我分配的所有内存吗?
不, clear()
仅删除列表中的所有项目。 在您的情况下,这些项目是关于AppointmentSchedule
对象的指针。
在为AppointmentSchedule
对象设置父对象时,将删除其对象的父对象。 这就是为什么你的情况下没有内存泄漏的原因。
它会释放我分配的所有内存吗?
不。您声明了一个指向 AppointmentSchedule
对象的指针列表。 当你调用clear
,那些指针将被删除,但是它们指向的内存将保持不变,因此你会得到内存泄漏。
要释放对象本身,请使用智能指针(如std::unique_ptr
和std::shared_ptr
)或在调用clear()
之前在任何类型的foreach
循环中手动删除它们。
编辑:
在这种情况下,没有内存泄漏,因为Qt对象层次结构将负责正确的对象销毁。 请参阅@Kirill的回答。
因为你使用指针:为了避免内存泄漏,你需要删除每个指针,例如:
foreach(auto element, scheduleList)
{
delete element;
}
此外,如果您在AppointmentSchedule元素中使用父属性,则在删除父级时会自动删除它们。
关于列表本身:如果您想在列表中存储大对象(而不是指针),则调用.clear()
仅删除可访问的项目,但不一定要调整容器的大小。 如果每次调用它都会这样做,那将是低效的。
但是,您可以调用.squeeze()
来释放未使用的内存。 它仍然只删除为指针分配的空间,而不是删除使用new
运算符分配的堆上的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.