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);,但是程序然后segfaults就行了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