lundi 6 avril 2015

std::list remove_if deletes nodes?

I have user-defined class like this:



class Test {
public:
bool opeatator== (const Test& rhs) const {
return this->value_ == rhs.value_;
}
int value_;
};


I saved this pointer with std::list like this:



std::list<Test*> tests_;
tests_.push_back(new Test());


Then I tried to just remove node from list like this:



Test remove_key(1);
tests_.remove_if([remove_key](const Test* p) { return remove_key == *p; });


It remove all nodes which value_ is 1, but remove_if call ::operator delete() so object in list are deleted. As I know, remove_if only remove from list but it would not delete object, but when I debug it, list call destructor of Test class, and delete the object by ::operator delete(_Ptr). What am I wrong?


(Below code is STL list remove_if callstack(reverse order) in Visual Studio 2013.)


list



remove_if(_Pr1 _Pred) {
for (iterator _First = begin(); _First != end(); )
if (_Pred(*_First))
_First = erase(_First);
else
++First;
}

iterator erase(const_iterator _Where) {
_Nodeptr _Pnode = _Unlinknode(_Where++);
this->_Freenode(_Pnode);
return (_Makie_iter(_Where));
}

void _Freenode(_Nodeptr _Pnode) {
this->_Getal().deallocate(_Pnode, 1);
}

void deallocate(pointer _Ptr, size_type _Count) {
_Mybase::deallocate(_Ptr, _Count);
}

void deallocate(pointer _Ptr, size_type) {
::operator delete(_Ptr);
}

Aucun commentaire:

Enregistrer un commentaire