好吧,我正在创建这样的矢量
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
如果您能够使用C++ 11编译器,则可以使用其中一个智能指针.
std::vector<std::unique_ptr<Member>> emp;
Run Code Online (Sandbox Code Playgroud)
要么
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_ptr在http://www.devx.com/tips/Tip/13606中讨论了在STL容器中使用的缺陷(感谢@pstrjds链接).