【问题标题】:accessing element of boost sparse_matrix seems to stall program访问 boost sparse_matrix 的元素似乎停止了程序
【发布时间】:2010-11-21 20:06:35
【问题描述】:

我遇到了一个奇怪的错误,希望有更多经验的程序员能对此有所了解。我正在使用 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 矩阵中的某些元素,但不知何故,底层存储机制“放错了位置”。但是,我不确定为什么或如何解决它。这也可能完全不符合实际。

您能提供的任何帮助将不胜感激。如果我没有在这个问题中包含正确的信息,请让我知道我缺少什么。谢谢。

【问题讨论】:

    标签: c++ boost sparse-matrix


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的建议。我尝试从 bool 更改为 int 并出现同样的问题。我改成普通矩阵,问题就消失了,但是在不使用稀疏矩阵的情况下实际使用起来太慢了。我也尝试调用 get_cell,但有很多地方修改了矩阵,我不确定我是否找到了它们。不幸的是,我不得不使用一种解决方法并将这个问题放在次要位置上一段时间。感谢您的建议,如果我以后能够确定问题,我会发布它。
    • 用 valgrind 查找泄露的内存解决了这个问题。感谢您的帮助。
    【解决方案2】:

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

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

    【讨论】:

    • 我最初尝试使用多线程,但是当程序在单个执行线程中运行时存在同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2021-04-15
    • 1970-01-01
    • 2014-10-25
    • 2020-12-11
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多