dynamic_bitset,崩溃我的程序

时间:2011-08-11 13:03:14

标签: c++ boost

我是新手。我有一个在lambda函数中使用dynamic_bitset的程序。在我尝试运行程序后,我收到此消息。即使没有初始化bitset的函数和处理它的函数,也会出现此消息。

有人知道这条消息的含义以及可能出现的问题吗?

消息:

  

/usr/include/boost/dynamic_bitset/dynamic_bitset.hpp:616:boost::dynamic_bitset<Block, Allocator>::~dynamic_bitset() [with Block = long unsigned int, Allocator = std::allocator<long unsigned int>]:断言'm_check_invariants()'失败。   中止

代码就像这样 主要调用此函数:

int Molecule::initSimilarity(int depth){
    cout << "_size is: " << _size << "\t depth is: " << depth << endl; //TODO delete
    AtomSet viewing(_size);
    int m = 0;
    {
        // break into initial groups by symbol and valancy
        for(int i=0 ; i<_size ; i++)
        {
            if(viewing[i]) continue;
            AtomSet mask = getSetMask( //AtomSet is typedef for dynamic_bitset
                [&](const Atom& b)->bool
                {
                    return (!viewing[b._index] && b._valence == _atoms[i]->_valence && strcmp(b._symbol, _atoms[i]->_symbol) == 0);
                },
                [&](Atom &b)
                {
                    b._class = m; //set the equivalence class of atom 'b' to 'm'
                }
            );
            m++;
            viewing |= mask; //viewing now contains a set of atoms and for each atom it's equivalence class
        }
        cout << "number of equivalence class: " << m << endl; //TODO DELETE!
    }    
    for (int j = 0; j < depth ; j++){
        AtomSet viewed(_size);

        int before = m;
        // iteratively refine the breakdown into groups
        for (int i = 0 ; i < _size ; i++)   //for any atom A
        {
            if (viewed[i]) continue;
            viewed.flip(i);
            AtomSet mask = getSetMask(//put all atoms which are equivalnt but not similar to A in
                //their own equivalence class
                [&](const Atom& b)->bool
                {
                    if (viewed[b._index])
                        return false; //if b is in viewed return false;
                    if (_atoms[i]->_class == b._class) //if in the same class add b to viewed
                    {
                        viewed.flip(b._index);
                        bool similar = !isSimilar(*_atoms[i],b);
                        return similar;
                    }
                    return false;
                },
                [&m](Atom& b)
                {
                    b._class = m;
                }
            );
            if (!mask.none()) m++;
        }
        if (before == m){
            std::cout << "Finished early after just " << j << " iterations" << std::endl;
            return m;
        }
    }
    return m;
}

getSetMask的签名是: AtomSet getSetMask(std :: function property,std :: function action);

和最奇怪的事情,即使我删除该功能的所有内容,它仍然给我错误信息

4 个答案:

答案 0 :(得分:2)

您在lambda中引用的dynamic_bitset变量可能已经超出范围并且已经被破坏,或类似的东西。 (没有源代码,很难更具体)

答案 1 :(得分:2)

我遇到了类似的问题,即动态比特通过在它被销毁之前调用reset()来解决。

答案 2 :(得分:0)

这可能表示您正在写入bitset的末尾而不调整其大小。可能想做一些界限检查。

答案 3 :(得分:0)

我遇到了问题,花了3个小时才找出问题所在。这是可能发生的情况: dynamic_bitset 中的 operator [] 不进行绑定检查。因此,可以在允许范围之外分配一个值,并且不会产生任何错误(消毒剂/ valgrind看不到任何东西),因为dynamic_bitset使用64位整数(至少在我的计算机上)以存储值。因此,当您在dynamic_bitset中仅允许4位时,您可以获得32的存储整数。稍后在调用 m_check_invariant()时会触发该错误,例如在调用析构函数时。

因此,问题就变成了找到此范围错误。解决方案是编辑 boost / dynamic_bitset.hpp ,并在调用超出范围的操作时在 operator [] 的代码中添加打印语句。如果您不能执行此操作,请下载boost库并将其安装在主目录中。