2016-04-28 33 views
-1

這裏是我的名單如何正確刪除列表中的對象?

list<DisplayableObject> objects; 

我希望把新的顯示對象在其

我希望有一個功能能夠只是完全自由的清單,並刪除它

我見過擦除,清除等,但當我在網上閱讀時,人們說我需要明確地做到這一點,因爲這些類功能實際上不會釋放內存?

我做了一些新的方法,也不知道他們是否是正確的:

iter = objects.begin(); 
while (!objects.empty()) { 
    objects.remove(*iter); 
} 
objects.clear(); 
while (!objects.empty()) { 
    delete &objects.front(); 
    objects.pop_front(); 
} 
objects.clear(); 
while (!objects.empty()) { 
    delete &iter; 
    iter++; 
} 
objects.clear(); 

有沒有更好的方法?謝謝

+0

你是什麼意思「我不知道它們是否正確」。事先檢查大小和大小後?您是否嘗試過預先打印對象,然後查看是否刪除了正確的對象? – Tas

+0

我不知道內存是否正確釋放,或者如果有更簡單的方法來執行它 –

+0

你的意思是'std :: list'嗎?然後只需清除()'。 – songyuanyao

回答

2

您正在合併兩個不同的東西。讓我們以整數指針的std::list,並進行初始化像這樣:

std::list<int *> list; 

list.push_back(new int[7]); 
list.push_back(new int[5]); 

在這一點上,做一個

list.clear(); 

將徹底刪除列表中的元素。但是,列表中的元素是指向整數的指針,它們與指向的實際數據完全分開。數據未被釋放。這是你的責任,delete[]事前:

for (auto &item:list) 
     delete[] item; 
list.clear(); 

一個std::list僅在列表中刪除值負責。 A std::list不知道指針(如果列表包含指針)指向什麼。例如,使用相同的確切列表:

std::list<int *> list; 

int a; 
int b; 
list.push_back(&a); 
list.push_back(&b); 

該列表本身與第一個列表本身是完全一樣的。它仍然是一個整數指針列表。在這種情況下,

list.clear(); 

是唯一需要在這裏完成的。指針不是指向new -ed對象的指針。作爲一名C++開發人員,您有責任跟蹤自己不再需要的內容,以及delete

這就是爲什麼你不想使用原始的,普通的,純粹的指針,除非它是絕對必要的。相反,您希望使用std::shared_ptr,當不再需要這些對象時,它將自動生成deletenew ed對象。如果代替

class SomeClass {}; 

std::list<SomeClass *> list; 

你(使用一類,而不是int這裏,爲一個更好的例子)使用

std::list<std::shared_ptr<SomeClass>> list; 

;那麼當你

list.clear(); 

那麼如果指向的類成員被任何其他智能指針不再被引用,它們將被自動delete d。

+1

除非您確實需要共享所有權,否則最好使用'unique_ptr'而不是'shared_ptr',後者會導致維護引用計數的開銷。 – Wyzard

+0

非常感謝,非常有幫助 –

1

所有你需要做的就是調用objects.clear()。你的列表是由對象組成的(我假設DisplayableObject只是一個對象而不是一個指針),所以每個對象的析構函數都會被調用,並且列表將是空的。

現在,如果您已將簡單指針存儲在列表中的對象中,而不是簡單地存儲對象,那麼在調用objects.clear()之前,確實需要顯式釋放列表中的每個元素。釋放的指針列表。

+0

對不起,我將刪除tihs的問題,因爲它的愚蠢。感謝您爲我清除 –