如果使用remove_if,并且项是指向对象的指针,如何删除vector中的项?
How do delete items in a vector if using remove_if and items are pointers to objects?
我担心通过执行以下操作会遇到内存泄漏问题:
(示例代码)class myItem //random container stuff mostly. All primatives.
{
int index;
char* name;
int val1;
int val2;
};
class vecList
{
vector< myitem* > *myVec;
void delete()
{
MyVec->erase(std::remove_if(myVec->begin(), MyVec->end(), IsMarkedToDelete), MyVec->end()); //leak here?
}
};
Erase不释放内存,如果它是指针,对吗?如果我没有使用remove_if,我可以在销毁指针之前对它调用delete。在这种情况下我该怎么做呢?智能指针?我不喜欢用它们重新实现所有东西,我真的不想添加boost库。
谢谢!
您可以在IsMarkedToDelete
函数返回true时删除该项。
如果指向该对象的指针都在vector容器中,那么就没有对象一旦调用remove_if
就会泄漏内存。remove_if
移动指针,你把它记下来,但它什么也没说它返回的迭代器背后的值。因此,如果你有什么比如[a, b, c, d]
(其中a
、b
等代表不同的指针),然后在e = remove_if( v.begin(), v.end(), matches(b) )
之后,你的向量可能(也可能)看起来像[a, c, d, d]
和e
指向第二个d
, b
的所有踪迹将永远消失。
显而易见的解决方案是在vector
中使用shared_ptr
;这将确保任何指针最终从vector
中删除将被删除。如果做不到这一点,你可以使用两种方法:第一种方法在for_each
中添加如下内容:
struct DeleteIfCondition
{
void operator()( ObjectType* &ptr ) const
{
if ( condition( *ptr ) ) {
ObjectType* tmp = ptr;
ptr = NULL;
delete tmp;
}
}
};
std::for_each( v.begin(), v.end(), DeleteIfCondition() );
作为功能对象,后面接:
v.erase( std::remove( v.begin(), v.end(), NULL ), v.end() );
您可以使用remove_if
,然后使用for_each
从返回值直到结束,然后擦除。当然,这将使您的代码更长一些。另一种可能是存储shared_ptr
指针,如果你的代码同意的话。
以上是一个直言不讳的谎言,正如Benjamin指出的那样,所以你只剩下"另一种可能性"。
你可以使用这个函数:
template<typename T, typename TESTFN>
void delete_if(std::vector<T*>& vec, TESTFN&& predicate)
{
auto it = remove_if(vec.begin(), vec.end(), [&](T* item) {
if (predicate(item)) {
delete item;
return true;
}
return false;
});
vec.erase(it, vec.end());
}
,
delete_if(MyVec, [](T* item) { return item->index == 5; });
相关文章:
- 无法删除指针,已触发断点
- 删除指针数组 (C++) 中的元素
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 删除指针后内存泄漏
- 这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
- C++ 从 2 组指针中删除指针
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- 在这种情况下,删除指针数组期间会发生什么?
- 在C++中删除指针数组时析构函数崩溃
- 何时/如何在使用指针后正确删除指针?
- 在C++库中,谁应该删除指针、用户或库?
- 删除指针后阻止对象使用 "this"
- 删除指针后C++尝试/捕获
- 删除指针内存分配以避免内存泄漏
- 删除指针时,未分配被释放的 C++ 指针错误
- 如何从抽象类中删除指针
- 我应该在 v8::外部手动删除指针吗?
- 删除指针
- C 如何删除指针的默认对象成员