| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > порядок удаления объектов в std::vector |
| Автор: zim22 4.2.2010, 13:39 | ||||||||
| Я думал, что порядок вызовов деструкторов обратен порядку вызова конструкторов. Т.е. если создаётся сначала объект А, а потом объект Б, то при выходе из области видимости будет сначала удалён объект Б, а потом А. В случае создания С-массива объектов так и происходит.
Однако в случае std::vector элементы удаляются, начиная с индекса 0 и до конца. Это не противоречит Стандарту?
|
| Автор: mes 4.2.2010, 16:00 | ||
к объектам размещенным в куче это высказывание не относится |
| Автор: zim22 4.2.2010, 16:18 | ||
это понятно, что динамические объекты будут удалены принуждённо, используя delete. но тем не менее в Мейерсе "More effective C++" (Item 4) удаление объектов в куче производится от последнего к первому. я вот и задумался, почему он именно в таком порядке удалял. и пришёл только к одной логически обоснованной позиции: удаление от последнего к первому велось для того, чтобы не нарушать Стандарт, в котором возможно где-то сказано, что вызов деструкторов должен быть обратен вызову конструкторов.
|
| Автор: tolgamrab 4.2.2010, 16:42 | ||
пересмотрел стандарт на контейнеры (глава 23), нет там такого. Стандартизируется только сложность методов и интерфейсы. Так что у Мейерс, вероятно, решил перенести на динамический контейнер правила из другой области C++, чтобы избежать тонких проблем при использовании этого контейнера. Попытка встроить в алгоритм использование такой "фичи" ни к чему хорошему не приведет. |
| Автор: zim22 4.2.2010, 17:49 | ||||||
никто и не говорил. но в другой книге (совпадение?) элементы тоже удаляются в обратном порядке. в той книге (С++ Primer 4th edition, параграф 18.1.2) они создавали свой класс Vector и там была функция reallocate, которая вызывалась тогда, когда при вставке нового элемента в векторе не хватало места и необходимо было выделить кусок памяти побольше.
у меня вопрос: им что, всем делать нечего? почему они "извращаются" и удаляют в обратном порядке элементы? *** http://stackoverflow.com/questions/2083603/stl-containers-element-destruction-order сказано, что в ISO C++ standard для std::vector порядок удаления не установлен (unspecified). Т.е. как хотите - так и реализовывайте. а http://stackoverflow.com/questions/1781802/order-of-destruction-for-array-of-objects частично объясняется зачем удалять, начиная с последнего элемента:
|