C++ удаление указателей в структуре
День добрый! Возможно ли при создании динамической структуры данных struct* test=new struct
записывать указатель на созданную структуру скажем в вектор vector < struct > v таким образом:
v.push_back(*test);
чтобы в определенный момент пробежаться по элементам вектора v и вызвать для них delete?
Если да, то как выглядит удаление указателей в векторе?(компилятор без 11+ стандарта)
Ответы (2 шт):
То, что вы написали, сработает, но с большим количеством оговорок.
Во-первых, при пуше в вектор собственных объектов (у вас это *test) вызывается конструктор копирования. Если в вашем объекте есть указатели, под которые динамически выделена память, то конструктор копирования по умолчанию просто присвоит новому экземпляру адрес, а не содержащиеся по нему данные. Поэтому, если память освободится в другом месте программы, то у объекта в векторе будет ссылка на очищенную память ==> возможна ошибка сегментации.
Таким образом, передавая в вектор *test вы создаёте новый экземпляр и старый экземпляр из вектора удалить не можете.
Во-вторых, можно удалить динамический объект по его адресу в принципе из любого места в программе. В вашем случае для этого достаточно сделать, как писали в комментариях:
Object *obj = new Object;
vector<Object*> v;
v.push_back(obj);
...
...
...
for (vector<Object*>::iterator itr = v.begin(); itr != v.end(); ++itr) {
delete *itr; // разыменовывание итератора даёт указатель Object*
*itr = nullptr; // помогает избегать непредсказуемого поведения
}
v.clear();
Для удаления динамического объекта я бы воспользовался более лаконичным циклом:
Object *obj = new Object;
vector<Object*> v;
v.push_back(obj);
for (auto* elem : v) {
delete elem;
}
v.clear();