0

C++ 11 で特定の基準を満たしている場合はリストからオブジェクトを削除し、オブジェクトが見つかった場合は true を返そうとしています。

int x = 178;
typename network_internal_edge_store_type::iterator itr =
    internal_edges.begin();
for (; itr != internal_edges.end(); ++itr) {
  // If edge object found that has this property, then remove it.
  if (itr->index1() == x || itr->index2() == x) {
    itr = internal_edges.erase(itr);
    return true;
  }
}
return false;

ただし、この segfaults は行で発生しますitr = internal_edges.erase(itr);internal_edges上記で定義したネットワーク内のエッジを表すオブジェクトの共有ポインターのリストです。

最初は、無効な反復子を逆参照していると思ったので、その行にブレークポイントを設定しました。驚いたことに、イテレータをウォッチ式 ( *itr) として逆参照すると、イテレータは有効に見えました。

すると、イテレータが共有ポインタを指しているのが問題なのではないかと思い、itr->reset()前に試してみitr = internal_edges.erase(itr);たところ、 の行で segfault してしまいましたitr->reset()

他に何がこのセグメンテーション違反を引き起こす可能性がありますか?

の型について詳しくはこちらinternal_edges

class NetworkInternalEdge;
typedef NetworkInternalEdge network_internal_edge_type;
typedef std::weak_ptr< network_internal_edge_type > network_weak_edge_ptr;
typedef std::shared_ptr< network_internal_edge_type > network_shared_edge_ptr;
typedef std::list< network_shared_edge_ptr > network_internal_edge_store_type;
network_internal_edge_store_type internal_edges;

== エラーの追跡 ==

私はまだ小さなテストケースでこのエラーを再現しようとしています. _M_dispose();また、エラーが shared_ptr_base.hの行 (147 行目) に関連していることにも気付きました。

      void
  _M_release() noexcept
  {
    // Be race-detector-friendly.  For more info see bits/c++config.
    _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_use_count);
if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, -1) == 1)
  {
        _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_use_count);
    _M_dispose();
    // There must be a memory barrier between dispose() and destroy()
    // to ensure that the effects of dispose() are observed in the
    // thread that runs destroy().
    // See http://gcc.gnu.org/ml/libstdc++/2005-11/msg00136.html
    if (_Mutex_base<_Lp>::_S_need_barriers)
      {

共有ポインタに問題があるようです。消去時には、 を指す共有ポインターが 1 つ、ウィーク ポインターが 3 つ存在し**itrます。それは役に立ちますか?

4

0 に答える 0