所以我有一个叫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
它会释放我分配的所有内存吗?
感谢。
答案 0 :(得分:2)
它会释放我分配的所有内存吗?
不,clear()
仅从列表中删除所有项目。在您的情况下,这些项目是AppointmentSchedule
个对象的指针。
在为AppointmentSchedule
个对象设置父对象时,将删除其父对象时删除此对象。这就是为什么你的情况下没有内存泄漏。
答案 1 :(得分:1)
它会释放我分配的所有内存吗?
没有。您向AppointmentSchedule
对象声明了指针的列表。当你调用clear
时,这些指针将被删除,但是它们指向的内存将保持不变,因此你会得到内存泄漏。
要取消分配对象本身,请使用智能指针(如std::unique_ptr
和std::shared_ptr
)或在调用foreach
之前以任何类型的clear()
循环手动删除它们。< / p>
编辑:
在这种情况下,没有内存泄漏,因为Qt对象层次结构将负责正确的对象破坏。见@ Kirill的答案。
答案 2 :(得分:0)
因为你使用指针: 为避免内存泄漏,您需要删除每个指针,例如:
foreach(auto element, scheduleList)
{
delete element;
}
此外,如果您在AppointmentSchedule元素中使用父属性,则在删除父级时会自动删除它们。
关于列表本身:
如果您想在列表中存储大对象(而不是指针),则调用.clear()
仅删除可访问的项目,但不一定要调整容器的大小。如果每次调用它都会这样做,效率会很低。
但是,您可以调用.squeeze()
来释放未使用的内存。
它仍然只删除为指针分配的空间,而不是用new
运算符分配的堆上的对象。