2015-05-19 4 views
0

Я создаю некоторые объекты внутри цикла и добавить его в listwith:Удалить созданные объекты внутри списка

list<MyObject> myList;  
MyObject* ob = new MyObject(); 
ob.setAttribute("whatever"); 
myList.push_back(*ob); 

После завершения цикла, я использую список несколько раз. Я начал теперь детектор утечки и увидел, что я должен удалить все объекты MyObject.

Как я их правильно удаляю (в деструкторе?). Должен ли я использовать итератор? Но как я получаю реальный объект, а не указатель итератора?

Большое спасибо.

+1

Обратите внимание, что ваш список содержит необработанные объекты, а не указатели на них. – Rerito

+4

Это не скомпилируется - вы пытаетесь нажать указатель на список объектов. Если у вас нет достаточной причины для faffing around с 'new', просто сделайте' push_back (Object()) 'и не беспокойтесь о утечке памяти. –

+0

извините - я написал образец кода в вопросе и забыл добавить некоторые детали. Я изменил его. –

ответ

4

Здесь нет никакой причины для динамического выделения, поскольку список хранит объекты по значению. Все, что вы делаете, это копирование и отбрасывание динамического объекта; он просочился сразу, так как вы не указали на него нигде. Просто нажмите объекты непосредственно, копирование или временную автоматическую переменную при необходимости:

list<MyObject> myList;  
MyObject ob; 
ob.setAttribute("whatever"); 
myList.push_back(ob); 

Если вы сделали нужно хранить указатели, возможно, полиморфизм, то вы бы использовать смарт-указатели, чтобы избежать утечки:

list<std::unique_ptr<MyBase>> myList; 
std::unique_ptr<MyObject> ob(new MyObject); 
ob->setAttribute("whatever"); 
myList.push_back(ob); 

Если вам по какой-то причине жонглировать необработанные указатели, то да, вам придется их удалять самостоятельно. Вы действительно не должны пытаться это сделать.

1

Их не нужно удалять, они копируются при добавлении в список по push_back(). Но после того, как вы его использовали, вам нужно удалить ob. Такие, как:

list<MyObject> myList;  
MyObject* ob = new MyObject(); 
ob.setAttribute("whatever"); 
myList.push_back(*ob); 
delete ob; 

В принципе, вам не нужно использовать указатель здесь, можно просто объявить ob в стеке, чтобы избежать ручного управления памятью:

list<MyObject> myList;  
MyObject ob; 
ob.setAttribute("whatever"); 
myList.push_back(ob); 

И, в соответствии с требованием вашей программы , вы можете использовать какую-то умную точку, чтобы избежать такого ручного управления памятью, как:

list<std::shared_ptr<MyObject>> myList;  
myList.push_back(new MyObject); 
... 
// don't need to delete them manually 
Смежные вопросы