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

ran*_*dom 3 c++ pointers stl dangling-pointer

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

std::list<Foo*> fooList;
std::vector<Foo*> fooVec;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

GMa*_*ckG 6

没有.

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

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

std::vector<int*> v;
v.push_back(new int());
v.push_back(new int());
v.push_back(new int());
Run Code Online (Sandbox Code Playgroud)

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

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