c – 从STL容器中删除元素时是否调用了析构函数?

假设我有两个容器存储指向同一对象的指针:

std::list<Foo*> fooList;
std::vector<Foo*> fooVec;

假设我从其中一个容器中移除一个对象,如果它的方法是:

std::vector<Foo*>::iterator itr = 
  std::find( fooVec.begin(), fooVec.end(), pToObj );
fooVec.erase( itr );

CppReference说这会调用对象的析构函数.这是否意味着指向fooList中对象的指针是悬空指针?

我不想使用引用计数指针.如何处理这个问题?

最佳答案
没有.

从容器中删除指针时,您所做的就是从容器中获取指针值,不删除任何内容. (即:指针没有析构函数.)

但是,在容器中包含指针是危险的.考虑:

std::vector<int*> v;
v.push_back(new int());
v.push_back(new int());
v.push_back(new int());

如果你从未通过容器并删除每个容器,你就泄露了.更糟糕的是,这不是例外.您应该使用pointer container,它将删除它们在删除时指向的内容. (当容器破坏时,所有都会被删除.)

但是,在你的情况下,由于你在不同的地方共享指针,我看不到反对shared_ptr的论点;这正是它的制作方式.

转载注明原文:c – 从STL容器中删除元素时是否调用了析构函数? - 代码日志