如果它符合 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
。这有帮助吗?