我有一个向量,我用指向对象的指针填充。我正在努力学习良好的内存管理,并有几个一般性的问题:
发布于 2010-10-31 09:30:15
new
关键字声明的变量调用delete
。如果在堆上分配了内容,则必须将其删除(释放)以防止内存泄漏。delete myVec[index]
。例如:
for(int i = 0; i < myVec.size(); ++i)
delete myVec[i];
话虽如此,如果你打算在向量中存储指针,我强烈建议使用boost::ptr_vector
,它会自动处理删除操作。
发布于 2010-10-31 20:01:56
删除是真的吗?当我完成向量后,我必须遍历它,并在每个指针上调用
?
嗯,你不需要手动循环,你也可以使用算法:
#include <vector>
#include <algorithm>
#include <memory>
int main()
{
std::vector<Base*> vec;
vec.push_back(new Derived());
vec.push_back(new Derived());
vec.push_back(new Derived());
// ...
std::for_each(vec.begin(), vec.end(), std::default_delete<Base>());
}
如果你没有C++0x编译器,你可以使用boost:
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/construct.hpp>
std::for_each(vec.begin(), vec.end(), boost::lambda::delete_ptr());
或者,您可以编写自己的functor:
struct delete_ptr
{
template <class T>
void operator()(T* p)
{
delete p;
}
};
std::for_each(vec.begin(), vec.end(), delete_ptr());
发布于 2010-10-31 09:40:49
如果您有权访问C++0x,也可以使用std::unique_ptr。它取代了不能在容器中使用的过时std::auto_ptr。
https://stackoverflow.com/questions/4061438
复制相似问题