myVector.erase(myPtr)是否删除了myPtr指向的对象?

Bar*_*rth 7 c++ stl vector

如果我有以下代码,

Foo *f = new Foo();
vector<Foo*> vect;
vect.push_back(f);
// do stuff
vect.erase(f);
Run Code Online (Sandbox Code Playgroud)

我是否创建了内存泄漏?我想是这样,但是擦除这个词让人感觉它正在删除它.

写这个,我想知道将指针放在STL向量中是不是错误.你怎么看?

Joh*_*itb 8

是的,你创建了内存泄漏.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 */
Run Code Online (Sandbox Code Playgroud)

下一个C++标准(通常称为C++ 1x和C++ 0x)将包括std::shared_ptr.在那里,你也可以使用std::unique_ptr<T>哪个更快,因为它不允许复制.std::unique_ptr在c ++ 0x中使用容器类似于ptr_containerboost中的库.