3

我正在为一个库实现一个自定义迭代器,并且正在重载运算符 ++ 和 --。我的前缀运算符可以完美地工作,但我的后运算符会导致内存泄漏。

avl_iterator& operator++()
    {
        _node = utilities::next_node( _node );
        return (*this);
    }
avl_iterator& operator ++( int ) {
        avl_iterator temp(*this);
        ++(*this);
        return(temp);
    }

avl_iterator& operator -- () {
        _node = utilities::prev_node( _node );
        return (*this);
    }

avl_iterator& operator -- ( int ) {
        avl_iterator temp(*this);
        --(*this);
        return(temp);
    }

我意识到这是因为我正在返回一个临时变量,但我似乎无法思考(或找到)更好的方法来做到这一点。

4

1 回答 1

4

返回一个临时变量是非常好的:它将被复制回调用者,而原来的变量将被释放。只有当类没有正确管理其资源时,它才会成为一个问题。

您的解决方案有问题的原因是它不返回副本,而是返回对局部变量的引用temp,这是未定义的行为。

要解决此问题,您应该将后增量/减量运算符更改为

avl_iterator operator -- ( int ) {
    avl_iterator temp(*this);
    --(*this);
    return(temp);
}

avl_iterator operator ++( int ) {
    avl_iterator temp(*this);
    ++(*this);
    return(temp);
}

请注意,必须复制是广泛传播的建议背后的主要原因,即在迭代器上更喜欢前增量/减量运算符而不是后增量/减量对应物。

于 2013-03-01T01:00:36.410 回答