C++ удаление указателей в структуре

День добрый! Возможно ли при создании динамической структуры данных struct* test=new struct

записывать указатель на созданную структуру скажем в вектор vector < struct > v таким образом:

v.push_back(*test);

чтобы в определенный момент пробежаться по элементам вектора v и вызвать для них delete?

Если да, то как выглядит удаление указателей в векторе?(компилятор без 11+ стандарта)


Ответы (2 шт):

Автор решения: V. Fedulov

То, что вы написали, сработает, но с большим количеством оговорок.

Во-первых, при пуше в вектор собственных объектов (у вас это *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();
→ Ссылка
Автор решения: user427929

Для удаления динамического объекта я бы воспользовался более лаконичным циклом:

Object *obj = new Object;
vector<Object*> v;
v.push_back(obj);

for (auto* elem : v) { 
    delete elem; 
} 
v.clear();
→ Ссылка