有效清除矢量记忆

Dee*_*epN 1 c++

好吧,我正在创建这样的矢量

vector<Member*> emp;
Run Code Online (Sandbox Code Playgroud)

然后我像这样创建成员类的堆对象

Member* memObj = new Member();
Run Code Online (Sandbox Code Playgroud)

然后像这样使用push_back

emp.push_back(memObj);
Run Code Online (Sandbox Code Playgroud)

在使用了我所有的函数后,我必须通过这样的迭代来清除内存吗?

for( vector<Member*>::iterator iter = emp.begin();
                iter != emp.end(); )
{
    Member* mem = *iter;
    iter = emp.erase (iter); 
    delete mem;
    //iter++;
}
Run Code Online (Sandbox Code Playgroud)

除了遍历每个值之外,还有什么有效的方法吗?clear函数只调用析构函数,它清除值但不释放内存..我希望在这里实现多态...我是C++的新手....请帮助..提前谢谢.. :)我是使用C++ 11

R S*_*ahu 6

如果您能够使用C++ 11编译器,则可以使用其中一个智能指针.

std::unique_ptr

std::vector<std::unique_ptr<Member>> emp;
Run Code Online (Sandbox Code Playgroud)

要么

std::shared_ptr

std::vector<std::shared_ptr<Member>> emp;
Run Code Online (Sandbox Code Playgroud)

编辑

如果您无法使用C++ 11编译器,VS 2005肯定太旧而无法支持C++ 11,您必须手动删除对象,就像您所示.

但是,我会添加一个辅助类来帮助delete处理Member对象.

struct MemberDeleteHelper
{
    MemberDeleteHelper(std::vector<Member*> emp) : emp_(emp);

    ~MemberDeleteHelper()
    {
       for( vector<Member*>::iterator iter = emp.begin();
                iter != emp.end(); ++iter )
       {
          delete *iter;
       }
    }

    std::vector<Member*>& emp_;
};
Run Code Online (Sandbox Code Playgroud)

并将其用作:

vector<Member*> emp;
MemberDeleteHelper deleteHelper(emp);
Run Code Online (Sandbox Code Playgroud)

有了这个,emp无论你如何从函数返回,都将删除元素.如果从嵌套函数调用中抛出异常,则将展开堆栈并且emp仍将删除元素.

编辑2

不要使用auto_ptr对象std::vector.auto_ptrhttp://www.devx.com/tips/Tip/13606中讨论了在STL容器中使用的缺陷(感谢@pstrjds链接).

  • 可能很好指出,如果你不使用C++ 11编译器,请不要在std :: vector中使用`auto_ptr` (2认同)