访问boost sparse_matrix的元素似乎停止了程序

时间:2009-08-22 01:00:45

标签: c++ boost sparse-matrix

我有一个奇怪的错误,我希望有更多经验的程序员可能会对此有所了解。我正在使用boost ublas稀疏矩阵,特别是mapped_matrix,并且最终会发生间歇性错误,但不会在程序的初始阶段发生。这是一个大型程序,所以我不能发布所有代码,但核心思想是我调用属于特定类的函数:

bool MyClass::get_cell(unsigned int i, unsigned int j) const
{
    return c(i,j);
}

变量c被定义为类

的成员
boost::numeric::ublas::mapped_matrix<bool> c;

当错误发生时,程序似乎停止(但不会崩溃)。使用Eclipse进行调试,我可以看到程序进入boost mapped_matrix代码并继续向下几级进入std :: map,std :: _ Rb_tree和std :: less。此外,该程序偶尔会追溯到std :: map,std :: _ Rb_tree和std :: _ Select1st。当代码正在执行并且_Rb_tree中的内存中的活动行发生了变化时,执行似乎永远不会返回std :: map的级别。程序停留在std :: map中的行是返回以下函数。

const_iterator
find(const key_type& __x) const
{ return _M_t.find(__x); }

在我看来,程序正在寻找的c矩阵中有一些元素,但不知何故底层存储机制“错放了它”。但是,我不确定为什么或如何解决它。这也可能完全偏离基础。

非常感谢您提供的任何帮助。如果我没有在这个问题中包含正确的信息,请告诉我我错过的内容。谢谢。

2 个答案:

答案 0 :(得分:1)

尝试调试代码的一些事情(不一定是永久性更改):

  • bool更改为int的矩阵类型中的c,以查看矩阵是否需要数字类型。
  • 使用类似的界面将矩阵类型更改为另一个,可能是普通的matrix
  • Valgrind应用程序(如果你在Linux上)检查你是不是在破坏内存。

如果失败,您可以在每次修改矩阵时尝试调用get_cell以查看可能导致问题的原因。

如果不这样做,您可能需要尝试将问题减少到可以在此处发布的更小代码子集。

如果您告诉我们您正在使用的编译器和操作系统,可能会有所帮助。

答案 1 :(得分:0)

这是多线程程序的一部分吗?

我问,因为通常当我在STL中看到问题时,最终会出现非同步访问的问题。