从指针向量中删除对象
Deleting objects from a vector of pointers
我看过一些非常相似的问题,但我仍然无法解决这个问题。
考虑简单类:
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;
}
现在我想要一个指向obobjs的指针向量。源代码详细说明了这个问题:
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中的析构函数只在程序完成时调用。我希望当对象从vector中擦除时调用它
澄清:我试图删除对象使用引用从矢量。我不能让它这么做。我知道向量不会释放内存。它只是从向量中移除了引用。谁能提供代码来删除对象并使用vector的引用调用析构函数?
编辑:即使添加:
auto it = objs.begin() + 0;
delete *it;
objs.erase(it);
按照建议,Obj的析构函数不会触发
正如许多注释所指出的那样,vector.erase
只从向量中删除元素。它不会尝试删除任何关联的内存。
要显式地删除关联的内存,您需要:
int main(int argc, const char * argv[])
{
...
auto it = objs.begin() + i;
delete *it;
objs.erase(it);
}
实际上,在你的情况下:
int main(int argc, const char * argv[])
{
std::vector<Obj*> objs;
Obj* o = new Obj(10);
objs.push_back(o);
auto it = objs.begin();
delete *it;
objs.erase(it);
}
你的代码中还有许多不一致的地方,对于你正在尝试做的事情,有更好的解决方案,比如:
使用
vector<Obj>
:int main(int argc, const char * argv[]) { std::vector<Obj> objs; objs.emplace_back(10); auto it = objs.begin(); objs.erase(it); }
如果你需要动态分配你的对象,但由于某种原因不希望向量处理它,你可以使用
shared_ptr
或unique_ptr
,他们将为你处理释放:int main(int argc, const char * argv[]) { std::vector<std::unique_ptr<Obj>> objs; objs.emplace_back(new Obj(10)); auto it = objs.begin(); objs.erase(it); }
当你从vector容器中擦除一个元素(指针)时,你只是将它从vector容器中移除。但是指针指向的位置仍然是堆上的有效内存。如果你想释放内存,你应该使用delete,并显式地释放内存。如果您不想自己管理内存,请使用智能指针。
从vector中擦除元素时,将调用该元素的析构函数。但是在本例中,对象是一个指针,而指针没有析构函数。在指针上使用delete
之前,指针指向的对象将不会调用的析构函数。如果指针被擦除,而你没有它的另一个副本,你将永远无法删除它,你将有一个内存泄漏。
在可能的情况下,更倾向于将对象本身放在vector中,而不是指针中。
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象