需要帮助调试bad_alloc和out_of_range异常

时间:2013-11-17 08:16:20

标签: c++ boost

我最近对我的程序进行了一些修改,现在我收到了很多bad_allocout_of_range例外情况。我也使用最新的boost-trunk版本,因为我不能使用1.55(我使用VC ++ 12和boost-serialization)。

由于我无法使用旧的提升回到以前的版本,我不能一步一步地查找问题。

我不习惯接受这些例外,所以我真的不知道如何找到原因。以下是导致错误的行之一(异常更改的位置):

// userDefinedFile.cpp:
// 
// colonySequence is std::list<std::unique_ptr<UserDefClass>>
// allocated_cells is std::vector<std::unique_ptr<UserDefClass>>
colonySequence.emplace_front(
  new Colony(allocated_cells.begin(), allocated_cells.end())
); // this causes the error

输出:

  

HEAP [EDIN.exe]:HEAP:在706849c修改的自由堆块7068430   在它被释放后,EDIN.exe触发了一个断点。

<vector>中的堆栈进一步上升我看到了这个:

template<class _Iter>
    void _Construct(_Iter _First, _Iter _Last, forward_iterator_tag)
    {   // initialize with [_First, _Last), forward iterators
    if (_Buy(_STD distance(_First, _Last))) // ERROR HERE
        {   // nonzero, fill it
        _TRY_BEGIN
        this->_Mylast = _Ucopy(_First, _Last, this->_Myfirst);
        _CATCH_ALL
        _Tidy();
        _RERAISE;
        _CATCH_END
        }
    }

_STD distance(_First, _Last)返回的值很大(116697808)并且似乎导致错误,但allocated_cells的大小只有46,所以我不明白为什么会发生这种情况。

这似乎不是我内存泄漏的症状。你会如何解决这个问题?您期望产生这种错误的代码类型是什么?

以下是Colony构造函数:

//Construct a colony with a sequence of cells
template <typename CellSptrIt> 
Colony::Colony(CellSptrIt const begin, CellSptrIt const end) : 
sector(&(*begin)->Sector()),
cellSequence(begin,end),
bounds(Colony::Bounds(begin,end))
{}

CellSptrItCellSptr个对象容器的迭代器,它们本身就是std::shared_ptr<Cell>的typedef。 Cell是用户定义的对象,但由于构造函数不参与错误,我怀疑它不相关。 Cell.Sector()返回对描述单元格区域的对象的引用,因此sector(&(*begin)->Sector())只是将扇区值从单元格复制到集群(单元格和集群必须属于同一扇区) )。

1 个答案:

答案 0 :(得分:0)

我在进行序列化时遇到了bad_alloc,因为我忘记在重新读取之前关闭输出流。