c++ - std::list remove_if 删除节点?

标签 c++ list c++11 stl remove-if

我有这样的用户定义类:

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

我像这样用 std::list 保存了这个指针:

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

然后我尝试像这样从列表中删除节点:

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

它移除所有value_为1的节点,但是remove_if调用::operator delete()所以列表中的对象被删除。 据我所知,remove_if 只是从列表中删除,但它不会删除对象,但是当我调试它时,列表调用测试类的析构函数,并通过 ::operator delete(_Ptr) 删除对象。 我错了什么?

(以下代码是 Visual Studio 2013 中的 STL 列表 remove_if 调用堆栈(倒序)。)

列表

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);
}

最佳答案

but when I debug it, list call destructor of Test class

不,它没有。相反,你的析构函数被调用是因为

  1. 您已经创建了一个作用域变量 remove_key ,它的析构函数将在作用域外时自动调用
  2. 您的 lambda 按值捕获了 remove_key,因此当堆栈从 lambda 展开时,将调用 remove_key 的析构函数。

在单独的上下文中,您突出显示的代码专门用于删除链接列表的节点,而不是删除 Test 对象。

所以

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

删除了链接列表中存储指向 Test 的指针的节点。

关于c++ - std::list remove_if 删除节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29469693/

相关文章:

c++ - 迭代基本类型时使用 const 引用有什么缺点吗?

c++ - 根据自定义 Iterator<T> 将返回值定义为 * 或 &

python - 将元组的嵌套列表转换为元组中第一个元素的嵌套列表

android - bool java.util.List.add(java.lang.Object)

C++11 构造函数和 operator= 的统一初始化

c++ - 模板类运算符重载的不同错误和警告问题

c++ - 指向数组的指针是否指向数组的第一个元素

c++ - 解析字符串,其中 "separator"可以作为数据的一部分?

c++ - 为什么不能在类中引用转发声明的 friend 类?

r - 矩阵列表乘以标量,Rcpp 中不保留维度属性