2012-05-08 9 views
3

私は最近、libxml ++(libxml2用のC++ラッパー)を使用している間、非常に興味深い不一致を見つけました。std :: listの割り当てに関するlibstdC++の不具合?

ライブラリは、デフォルトのSTLリストコンテナ(std::list<xmlpp::Node*>)を使用してノードリストを返します。 デフォルトのリポジトリからインストールされているので、C++ 03モードでビルドされているようです(しかし、私はC++ 11で作業しています)。

ここでの注意点は、C++ 11が方法を変更したことです。std::list::size()
C++ 03では、O(n)で、毎回std::distance(begin(), end())を呼び出しました。そして、事前計算された値を返します。ここで

はコードです:

/** Returns the number of elements in the %list. */ 
    size_type 
    size() const _GLIBCXX_NOEXCEPT 
    { 
#ifdef __GXX_EXPERIMENTAL_CXX0X__ 
    return this->_M_impl._M_size; 
#else 
    return std::distance(begin(), end()); 
#endif 
    } 

物事は私がライブラリーから、そのようなリストを受け取り、それにsize()を呼び出すときに発生し始めます。そこで私は140734320138496のような値を読んでいます。これは明らかに初期化されていないカウンタを示しています。元のリストにはカウンターが全くありませんでした。
手動でstd::distance (list.begin(), list.end())を呼び出すことはもちろん可能です。

質問は - これはGCC/libstdC++のバグと見なすことができますか、別のGCCモードでビルドされた実行ファイルを決してリンクしないでください。

答えて

6

私はそれがOne Definition Ruleに違反していると思います。あなたのコードは、あなたのライブラリが使用しているものとは異なる定義でstd::listでコンパイルされています。 (これはGCCのバグではなく、未定義の動作です。)

ライブラリを再コンパイルする(またはコードを再コンパイルする)必要があります。

+0

あ、そうです。ありがとう。 – intelfx

関連する問題