2016-08-24 34 views
3

所以我有類調用AppointmentSchedule這是以下類型:QList清除函數調用是否清除存儲在QList中的動態分配對象的內存?

namespace Ui { 
class AppointmentSchedule; 
} 

class AppointmentSchedule : public QWidget 
{ 
    Q_OBJECT 

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

這個類的uiQLabel類型的兩個對象和QDateTimeEdit類型的兩個對象。在外部類中,我需要有一個類型的動態分配對象的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(); 

將它釋放了所有我所分配的內存?

謝謝。

回答

2

它會釋放我分配的所有內存嗎?

不,clear()只從列表中刪除所有項目。在你的情況下,這些項目是指向AppointmentSchedule對象的指針。

當您爲AppointmentSchedule對象設置父項時,此對象將在其父項被銷燬時被刪除。這就是爲什麼你的情況下沒有內存泄漏。

1

它是否會釋放我分配的所有內存?

號你宣佈指針AppointmentSchedule對象名單。當你打電話給clear時,這些指針將被刪除,但它們指向的內存將保持不變,所以你會得到內存泄漏。

解除分配對象本身,呼籲clear()之前使用智能指針(如std::unique_ptrstd::shared_ptr),或在任何一種foreach循環手動刪除它們。

編輯:

在這種情況下將不會有內存泄漏作爲Qt的對象分層結構會照顧正確的對象的破壞。見@ Kirill的答案。

+0

謝謝,我很快就會接受你的回答。我實際上已經按照你所說的關於在你寫答案之前手動刪除它們。所以,我們同意這一點。 :) –

+1

但是在提供的代碼中沒有內存泄漏。 AppointmentSchedule對象具有父對象,這就是爲什麼當父對象被銷燬時這些對象將被刪除。 –

+1

@the_naive請注意基里爾的答案。你爲你的對象設置非nullptr父母,所以父母的析構函數將刪除它們,你不需要手動刪除它們。這是Qt對象層次結構的一個特性,也是刪除嵌套窗口小部件的常用方法。 – Sergey

0

由於您使用指針: 爲了避免內存泄漏,你需要刪除所有的指針。比如用:

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

此外,如果你在你的AppointmentSchedule元素使用parent屬性,它們會自動在刪除父刪除。

關於清單本身: 如果你想存儲在列表中大型對象(不是指針),調用.clear()只刪除訪問項目,但它並不一定調整容器。如果每次你這麼做,那都是低效的。

但是,您可以撥打.squeeze()來釋放未使用的內存。 它仍然只刪除分配給指針的空間,而不是用new運算符分配給堆的對象。

+0

['qDeleteAll'](http://doc.qt.io/qt-5/qtalgorithms.html#qDeleteAll-1)是一種方便的方法,用於刪除容器中的所有對象 –

+0

@king_nak +1該成語 – Veenkar