2009-08-22 74 views
0

我有一个奇怪的错误,我希望更多的经验程序员可能有一些洞察。我正在使用boost ublas稀疏矩阵,特别是mapped_matrix,并且最终发生了一个间歇性错误,但不是程序的初始阶段。这是一个大的程序,所以不能发布所有的代码,但其核心思想是,我称之为属于一个特定类的函数:访问提升sparse_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矩阵中有一些元素,但不知何故底层存储机制“错放了它”。但是,我不确定为什么或者如何解决这个问题。这也可能完全脱离基地。

任何帮助,你可以提供将不胜感激。如果我没有在这个问题中包含正确的信息,请让我知道我错过了什么。谢谢。

回答

1

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

  • 更改bool在矩阵型的intc,看是否矩阵预计数字类型。
  • 将矩阵类型更改为具有类似接口的另一个,可能是普通的旧matrix
  • Valgrind应用程序(如果你在Linux上)检查你是不是在破坏内存。

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

如果失败了,您可能需要尝试将问题简化为更小的代码子集,您可以在此处发布。

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

+0

谢谢你的建议。我试图从一个布尔变成一个int并发生同样的问题。我改成了一个普通的矩阵,问题就消失了,但是如果不使用稀疏矩阵,实际使用速度太慢。 我也试着调用get_cell,但是有很多地方矩阵被修改,我不确定我是否找到了它们。 不幸的是,我不得不使用一种解决方法,并把这个问题放在backburner一段时间。感谢您的建议,如果我能在稍后确定问题,我会发布它。 – RandomGuy 2009-08-25 15:37:38

+0

用valgrind查找泄漏内存解决了这个问题。感谢您的帮助。 – RandomGuy 2009-08-31 21:31:10

0

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

我问,因为通常当我在STL中看到问题时,它最终会成为未同步访问的问题。

+0

我最初尝试使用多线程,但当程序在单个执行线程内运行时存在相同的问题。 – RandomGuy 2009-08-22 03:03:33