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 に答える