Вектор указателей на динамически размещаемые объекты: что может пойти не так? - PullRequest
0 голосов
/ 16 августа 2011

Я проверил эту тему перед публикацией здесь: Как избежать утечек памяти при использовании вектора указателей для динамически размещаемых объектов в C ++?

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

vector<MyType*> a;
a.push_back(new MyType());

Эти векторы являются частными переменными экземпляра нескольких классов, которые я пишу, и динамически размещенные объекты уничтожаются в деструкторах классов путем итерации по векторам и вызова delete для каждого указателя.

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

Существуют ли причины, по которым адрес динамически размещаемого объекта может измениться и привести к тому, что указатели станут недействительными?

Я могу попытаться опубликовать реальный код, если это необходимо.

EDIT:

Хорошо, у меня здесь много вещей. Есть два пользовательских класса: VisaLane и VisaResource. VisaLane содержит vector<VisaResource*> указателей на VisaResources, созданных с использованием new VisaResource().

Каждый VisaLane также создается с использованием new VisaLane(), указатели которого хранятся в vector<VisaLane*>.

Это один пример того, как указатель повреждается. Элемент 0 в векторе имеет недоступных членов:

resources_  <3 items>   std::vector<VisaResource*>
    [0]     VisaResource
        function_   <not accessible>    std::string
        name_   <not accessible>    std::string
        state_  VisaResource::FREE  VisaResource::VisaResourceState
        value_  6998928 uint
    [1]     VisaResource
        function_   "lane_clksel"   std::string
        name_   "m1_lane0_clksel"   std::string
        state_  VisaResource::FREE  VisaResource::VisaResourceState
        value_  0   uint
    [2]     VisaResource
        function_   "lane_bypass"   std::string
        name_   "m1_lane0_bypass"   std::string
        state_  VisaResource::FREE  VisaResource::VisaResourceState
        value_  0   uint
visa_res_itr        __gnu_cxx::__normal_iterator<VisaResource**, std::vector<VisaResource*>>

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Вы можете создать свой собственный класс интеллектуального указателя с подсчетом ссылок для контейнеров STL или использовать std::unique_ptr, если ваш компилятор поддерживает C ++ 0x.Если он немного старше, у вас может быть что-то в пространстве имен std::tr1.

Альтернативно рассмотрите std::vector<MyType>, поскольку этот контейнер все равно распределяется в куче и будет управлять памятью за вас.Избегайте необработанных указателей любой ценой.

1 голос
/ 16 августа 2011

Вы вообще не должны использовать необработанные указатели. Лучший способ избежать этого - использовать Умные указатели , Unique_ptr, если вы не делитесь своим векторным содержимым shared_ptr, если совместно используются элементы контейнера. через несколько единиц.

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

Кроме этого, не видя исходного кода, мы не можем комментировать то, что действительно идет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...