Я изучал динамическое распределение и наткнулся на этот вопрос в StackOverflow:
Выделение объектов, хранящихся в векторе?
В одном из ответов с голосованием объясняется, как вручную управлять памятью при использовании «Векторов указателей на объекты»: итерация по вектору, вызывающая удаление.
Мой вопрос о том, как удалить определенные элементы вектора, а не весь вектор. В приведенном ниже примере программы у меня есть вектор указателей на объекты. Представьте, что переменная x этих объектов уменьшается со временем ... Когда значение x объекта достигает числа (скажем, 3), я хочу удалить объект; ОДНАКО, я бы хотел, чтобы вектор всегда сортировался по значениям х объектов.
Проблема в том, что когда я вызываю delete для объектов, значения x которых достигают 3, объект удаляется, но там все еще есть указатель, указывающий на случайные ячейки памяти, и размер вектора остается неизменным.
Когда я перебираю вектор, печатающий значения x, элементы, для которых я вызвал delete, все еще там, но указывают на значения, такие как -53408995. Как избавиться от элемента указателя на вектор, а также от объекта?
Вызов стереть не вариант, потому что в моей реальной программе (не минимальный пример ниже) вектор постоянно сортируется по другим факторам, которые изменяют эквиваленты значения х. Я не могу отслеживать их индекс. Я хотел бы удалить как объект, так и элемент указателя при выполнении итерации по вектору для проверки значения x.
Пример:
#include <iostream>
#include <vector>
class A
{
public:
A(int i) { x = i; }
int x;
};
int main()
{
std::vector<A*> Vec;
Vec.push_back(new A{ 5 });
Vec.push_back(new A{ 4 });
Vec.push_back(new A{ 3 });
std::cout << "Size before = " << Vec.size() << std::endl; // 3
for (auto& a : Vec)
{
std::cout << a->x << std::endl;
if (a->x == 3) { delete a; }
}
std::cout << "Size after = " << Vec.size() << std::endl; // Still 3!
for (auto& a : Vec)
{
std::cout << a->x << std::endl; // Prints 5, 4 and a random memory location like -34528374
}
return 0;
}