mah*_*ood 29 c++ pointers memory-leaks vector
假设我已经定义了这样一个类:
class foo {
private:
std::vector< int* > v;
public:
...
void bar1()
{
for (int i = 0; i < 10; i++) {
int *a = new int;
v.push_back( a );
}
};
void bar2()
{
std::vector< int >::iterator it = v.begin();
for ( ; it != v.end(); it++ )
std::cout << (*it);
v.clear();
}
};
Run Code Online (Sandbox Code Playgroud)
简而言之,我在向量中推回一些指针,稍后我清除向量.问题是,这段代码是否有内存泄漏?我的意思是通过清除向量,指针被正确删除?
jua*_*nza 38
是的,除非删除指针,否则代码会有内存泄漏.如果foo类拥有指针,则有责任删除它们.您应该在清除向量之前执行此操作,否则将丢失需要释放的内存句柄.
for (auto p : v)
{
delete p;
}
v.clear();
Run Code Online (Sandbox Code Playgroud)
您可以通过使用std::vector合适的智能指针完全避免内存管理问题.
Tim*_*ers 10
我认为最短和最清晰的解决方案是:
std::vector<Object*> container = ... ;
for (Object* obj : container)
delete obj;
container.clear();
Run Code Online (Sandbox Code Playgroud)
小智 7
不,你只清除矢量存储.带有'new'的分配内存仍然存在.
for (int i =0; i< v.size();i++)
{
delete (v[i]);
}
v.clear();
Run Code Online (Sandbox Code Playgroud)
您可以使用for_each:
std::vector<int*> v;
template<typename T>
struct deleter : std::unary_function<const T*, void>
{
void operator() (const T *ptr) const
{
delete ptr;
}
};
// call deleter for each element , freeing them
std::for_each (v.begin (), v.end (), deleter<int> ());
v.clear ();
Run Code Online (Sandbox Code Playgroud)