(请注意,以任何未来的读者:错误,勿庸置疑,在我的代码,而不是标准:: _ Rb_tree_rebalance_for_erase())故障:: _ Rb_tree_rebalance_for_erase()
我有点新的编程我不确定如何处理似乎来自std函数的分段错误。我希望我在做一些愚蠢的事情(即滥用容器),因为我不知道如何解决它。
的精确误差是
方案接收信号EXC_BAD_ACCESS,无法访问存储器。
原因:在KERN_INVALID_ADDRESS地址:0x000000000000000c
0x00007fff8062b144中的std :: _ Rb_tree_rebalance_for_erase()
(GDB)回溯
#0 0x00007fff8062b144中的std :: _ Rb_tree_rebalance_for_erase()
#1 0x000000010000e593在仿真:: runEpidSim(这= 0x7fff5fbfcb20)在stl_tree.h:1263
#2 0x0000000100016078在main()在main.cpp中:43
离开成功之前的分段错误更新两个容器中的内容的功能。一个是boost::unordered_multimap
,称为carriage
;它包含一个或多个struct Infection
对象。另一个容器是std::multiset< Event, std::less< Event > > EventPQ
,称为ce
。
void Host::recover(int s, double recoverTime, EventPQ & ce) {
// Clearing all serotypes in carriage
// and their associated recovery events in ce
// and then updating susceptibility to each serotype
double oldRecTime;
int z;
for (InfectionMap::iterator itr = carriage.begin(); itr != carriage.end(); itr++) {
z = itr->first;
oldRecTime = (itr->second).recT;
EventPQ::iterator epqItr = ce.find(Event(oldRecTime));
assert(epqItr != ce.end());
ce.erase(epqItr);
immune[ z ]++;
}
carriage.clear();
calcSusc(); // a function that edits an array
cout << "Done with sync_recovery event." << endl;
}
最后的cout <<
行出现在seg故障之前。
到目前为止,我的想法是,在此功能之后立即尝试重新平衡ce
,但我不确定为什么再平衡会失败。
我已经证实了赛格故障更新消失(尽管该程序,然后立即崩溃其他原因),当我删除ce.erase(epqItr);
。我能够在代码中的另一个地方成功删除事件;我在那里用于清除ce
中的项目的代码是相同的到这里的内容。
没有优化(感谢,BDK)回溯分析透露了更多的信息:
计划接收信号EXC_BAD_ACCESS,无法访问内存。
原因:KERN_INVALID_ADDRESS在地址:0x000000000000000c
0x00007fff8062b144中的std :: _ Rb_tree_rebalance_for_erase()
(GDB)回溯
#0 0x00007fff8062b144中的std :: _ Rb_tree_rebalance_for_erase()
#1 0x00000001000053d2中的std :: _ Rb_tree,标准: :std_tree.h:1263
#2 0x0000000100005417在std :: multiset,std :: allocator>:std :: allocator> :: erase(this = 0x7fff5fbfdfe8,__position = {_ M_node = 0x10107cb50})。在stl_multiset上擦除(this = 0x7fff5fbfdfe8,__position = {_ M_node = 0x10107cb50})。H:346 #3 0x000000010000ba71在仿真:: runEpidSim(此= 0x7fff5fbfcb40)在Simulation.cpp:426
#4 0x000000010001fb31在main.cpp中主要():43
除非Xcode是读取行号错误,我的硬盘中唯一的stl_tree.h在1263行是空白的。
有几个人要求查看调用恢复的函数。这有点复杂:
struct updateRecovery{
updateRecovery(int s, double t, EventPQ & ce) : s_(s), t_(t), ce_(ce) {}
void operator() (boost::shared_ptr<Host> ptr) {
ptr->recover(s_, t_, ce_);
}
private:
int s_;
double t_;
EventPQ & ce_;
};
// allHosts is a boost::multiindex container of boost::shared_ptr<Host>
// currentEvents is the EventPQ container
// it is an iterator to a specific member of allHosts
allHosts.modify(it, updateRecovery(s, t, currentEvents));
cout << "done with recovery" << endl;
最后cout
打印。该代码之前没有这个特定版本的恢复功能。
诺亚罗伯茨正确地指出,问题出现在Simulation.cpp,第426行。下面跳转到尴尬的解决方案。
什么是stl_tree.h:1263? – 2010-05-19 20:50:32
在我的硬盘(也是我的HD上唯一包含'_Rb_tree_rebalance_for_erase'的文件)中显示的唯一stl_tree.h在行1263(?!)上是*空格*。我在i686-apple-darwin10上使用gcc 4.2.1(Apple build 5646)。 rebalance_for_erase函数在第299-429行定义。 – Sarah 2010-05-19 20:58:24
如果您在调用Host :: recover之后立即在调用代码中添加cout,是否打印出来?另外,尝试编译所有优化和内联关闭,你可能会得到一个更有用的堆栈跟踪 – bdk 2010-05-19 20:59:18