Некоторые вопросы по STL-карте и списку с использованием в C ++ - PullRequest
0 голосов
/ 13 мая 2011

Здравствуйте, я хотел бы спросить о: у меня есть карта и список

Вопросы:

Правильно ли следующая реализация диструктора:

   for (map<string,SymbolTableNode*>::iterator i = symbolTable.begin();
                         i != symbolTable.end(); ++i)
   {
       delete i;
   }
   symbolTable.clear();

или я скучаюнемного памяти?

О списке:

   list<MyClass2*> mylist;
   mylist.push_front(new MyClass());
   mylist.pop_front();

pop вызывает delete?или у меня утечка памяти в этом случае?Если есть проблема утечки, то что я могу сделать, чтобы избежать ее?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 13 мая 2011

Нет pop_front не будет вызывать удаление. Вы должны будете удалить указатель самостоятельно, прежде чем его вытолкнуть.

list<MyClass2*> mylist;
mylist.push_front(new MyClass());
delete mylist.front();
mylist.pop_front();

И деструктор, вероятно, должен быть:

delete i->second;
3 голосов
/ 13 мая 2011

у вас есть утечка.См умные указатели (http://en.wikipedia.org/wiki/Smart_pointer)

Более подробно:

list<boost::shared_ptr<MyClass2> > mylist;


mylist.pop(); // now it will invoke delete
1 голос
/ 13 мая 2011

Вам действительно нужен список указателей? Разве у вас нет простого списка?

list<MyClass> mylist;
mylist.push_front(MyClass());

Это избавит вас от боли управления памятью.

Если вам нужны указатели, тогда используйте умные указатели или контейнеры указателей из boost: http://www.boost.org/doc/libs/1_46_1/libs/ptr_container/doc/ptr_container.html

0 голосов
/ 13 мая 2011

Наваз - Вы не правы.

Элементом итератора для карты является пара, поэтому правильный вызов удаления:

delete (*i).second;

PS Хорошо - теперь я вижу, вы исправили это :)

0 голосов
/ 13 мая 2011
delete i;

Неправильно.

Это должно быть так:

delete i->second; 

Потому что i указывает на пару.

...