Я рассмотрел ряд вопросов, которые очень похожи, но я до сих пор не могу это исправить.Удаление объектов из вектора указателей
Рассмотрим простой класс:
class Obj
{
public:
Obj(int moose);
~Obj();
private:
int* val;
};
Obj::Obj(int num)
{
val = new int;
*val = num;
}
Obj::~Obj()
{
printf("Cleanup");
delete val;
}
Теперь я хочу, чтобы иметь вектор указателей на Objs. Источник детализирует проблему:
int main(int argc, const char * argv[])
{
std::vector<Obj*> objs;
Obj* o = new Obj(10);
objs.push_back(o);
objs.erase(objs.begin() + 0);
// should have been deleted by now - I want the destructor to have been called
// I have tried delete objs[0], casting to it and then deleting it.
return 0;
}
Деструктор в Obj вызывается только при завершении программы. Я хочу, чтобы он вызывался, когда объект удаляется из вектора.
Уточнение: Я пытаюсь удалить объект, используя ссылку из вектора. Я не могу это сделать. Я знаю, что вектор не освобождает память. Он просто удаляет ссылку из вектора. Может ли кто-нибудь предоставить код, который удалит объект и вызовет деструктор, используя ссылку из вектора.
Edit:
Даже после добавления:
auto it = objs.begin() + 0;
delete *it;
objs.erase(it);
как предложено, деструктор Obj не срабатывает.
Тогда вам нужно будет использовать 'delete', прежде чем удалять его, или использовать что-то вроде контейнера интеллектуальных указателей или' ptr_vector' Boost. – chris
'std :: vector <>' не разрушает его элементы, он просто удаляет их из контейнера. Вам нужно удалить память. – 0x499602D2
Вы хотите использовать shared_ptr или ptr_vector http://stackoverflow.com/questions/10790161/shared-ptr-with-vector – Daniel