Я проверил эту тему перед публикацией здесь: Как избежать утечек памяти при использовании вектора указателей для динамически размещаемых объектов в 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*>>