如果我有下面的代码,
Foo *f = new Foo();
vector<Foo*> vect;
vect.push_back(f);
// do stuff
vect.erase(f);
我造成了内存泄漏吗? 我猜是的,但是erase这个词给人的感觉是在删除它。
写到这里,我想知道将指针放在 STL vector 中是否是错误的。你怎么看?
最佳答案
是的,您由此造成了内存泄漏。 std::vector 和其他容器只会删除指针,它们不会释放指针指向的内存。
将指针放入标准库容器中并不罕见。然而,问题是您必须在从容器中删除它时跟踪删除它。一种更好但更简单的方法来执行上述操作,是使用 boost::shared_ptr:
{
boost::shared_ptr<foo> f(new foo);
std::vector< boost::shared_ptr<foo> > v;
v.push_back(f);
v.erase(v.begin());
} /* if the last copy of foo goes out of scope, the memory is automatically freed */
下一个 C++ 标准(通常称为 C++1x 和 C++0x)将包括 std::shared_ptr
.在那里,您还可以使用 std::unique_ptr<T>
哪个更快,因为它不允许复制。使用 std::unique_ptr
在 c++0x 中使用容器类似于 ptr_container
boost 中的库。
关于c++ - myVector.erase(myPtr) 是否删除 myPtr 指向的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/281365/