Нет ничего плохого в хранении указателей в стандартном контейнере - будь то вектор, сет, карта или что-то еще. Вам просто нужно знать, кому принадлежит эта память, и убедиться, что она выпущена соответствующим образом. Выбирая контейнер, выберите контейнер, который наиболее подходит для ваших нужд. Vector отлично подходит для произвольного доступа и добавления, но не так хорош для вставки в другое место контейнера. list очень хорошо справляется со вставками, но не имеет произвольного доступа. Наборы гарантируют, что в контейнере нет дубликатов, и он отсортирован (хотя сортировка не очень полезна, если набор содержит указатели, а вы не предоставляете функцию компаратора), тогда как карта представляет собой набор пар ключ-значение, поэтому сортировка и доступ осуществляется по ключу. И т. Д. И т. Д. Каждый контейнер имеет свои плюсы и минусы, и то, что лучше всего подходит для конкретной ситуации, полностью зависит от этой ситуации.
Что касается указателей, опять же, указатели в контейнерах - это хорошо. Проблема, о которой вам нужно беспокоиться, заключается в том, кто владеет памятью и, следовательно, должен беспокоиться об ее освобождении. Если существует чистый объект, которому принадлежит то, на что указывает конкретный указатель, то, вероятно, именно этот объект освобождает его. Если по сути это контейнер, которому принадлежит память, то вам нужно убедиться, что вы удалили все указатели в контейнере, прежде чем контейнер будет уничтожен.
Если вас беспокоит наличие множества указателей на одни и те же данные, плавающих вокруг, или у вас нет явного владельца для определенного фрагмента памяти, тогда интеллектуальные указатели являются хорошим решением. * Boost shared_ptr
, вероятно, будет хорошим вариантом для использования, а shared_ptr
будет частью C ++ 0x. Многие полагают, что вы всегда должны использовать общие указатели, но есть некоторые накладные расходы, и то, будет ли это лучше для вашего конкретного приложения, будет полностью зависеть от вашего приложения.
В конечном счете, вы должны знать о сильных и слабых сторонах различных типов контейнеров и определять, какой контейнер лучше всего подходит для всего, что вы делаете. То же самое касается того, как бороться с управлением указателями. Вы должны написать свою программу таким образом, чтобы было ясно, кому принадлежит определенный кусок памяти, и убедитесь, что этот владелец освобождает ее, когда это необходимо. Общие указатели - только одно решение для этого (хотя превосходное). Какое лучшее решение зависит от особенностей вашей программы.