我最近对我的程序进行了一些修改,现在我收到了很多bad_alloc
和out_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))
{}
CellSptrIt
是CellSptr
个对象容器的迭代器,它们本身就是std::shared_ptr<Cell>
的typedef。 Cell
是用户定义的对象,但由于构造函数不参与错误,我怀疑它不相关。 Cell.Sector()
返回对描述单元格区域的对象的引用,因此sector(&(*begin)->Sector())
只是将扇区值从单元格复制到集群(单元格和集群必须属于同一扇区) )。
答案 0 :(得分:0)
我在进行序列化时遇到了bad_alloc,因为我忘记在重新读取之前关闭输出流。