std 函数 std::_Rb_tree_rebalance_for_erase () 中的分段错误

2024-01-04

(请注意未来的读者:不出所料,错误出现在我的代码中,而不是 std::_Rb_tree_rebalance_for_erase () )

我对编程有点陌生,不确定如何处理似乎来自 std 函数的分段错误。我希望我做了一些愚蠢的事情(即滥用容器),因为我不知道如何修复它。

精确的误差是

程序收到信号 EXC_BAD_ACCESS,无法访问内存。
原因:KERN_INVALID_ADDRESS,地址:0x000000000000000c
std::_Rb_tree_rebalance_for_erase () 中的 0x00007fff8062b144
(gdb) 回溯
#0 0x00007fff8062b144 在 std::_Rb_tree_rebalance_for_erase ()
#1 0x000000010000e593 在Simulation::runEpidSim (this=0x7fff5fbfcb20) at stl_tree.h:1263
#2 0x0000000100016078 在 main () 处 main.cpp:43

在分段错误之前成功退出的函数会更新两个容器的内容。一个是一个boost::unordered_multimap called carriage;它包含一个或多个struct Infection对象。另一个容器的类型是std::multiset< Event, std::less< Event > > EventPQ called 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 << 该行出现在段故障之前。

到目前为止我的想法是正在尝试重新平衡ce紧随此功能之后,但我不确定为什么重新平衡会失败。


Update

我已经确认当我删除时,段错误消失了(尽管程序因其他原因立即崩溃)ce.erase( epqItr );。我能够在代码中的其他位置成功删除事件;我用来删除其中项目的代码ce is 完全相同的到这里的东西。

回溯without优化(感谢,bdk)揭示了更多信息:

程序收到信号 EXC_BAD_ACCESS,无法访问内存。
原因:KERN_INVALID_ADDRESS,地址:0x000000000000000c
std::_Rb_tree_rebalance_for_erase () 中的 0x00007fff8062b144
(gdb) 回溯
#0 0x00007fff8062b144 在 std::_Rb_tree_rebalance_for_erase ()
#1 0x00000001000053d2 in std::_Rb_tree, std::less, > std::allocator >::erase (this=0x7fff5fbfdfe8, __position={_M_node = 0x10107cb50}) at > stl_tree.h:1263
#2 0x0000000100005417 in std::multiset, std::allocator >::erase (this=0x7fff5fbfdfe8, __position={_M_node = 0x10107cb50}) at stl_multiset.h:346 #3 0x000000010000ba71 在Simulation::runEpidSim (this=0x7fff5fbfcb40) 在Simulation.cpp:426
#4 0x000000010001fb31 在 main () 处 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印刷。该代码以前可以在没有此特定版本的恢复功能的情况下工作。

Noah Roberts 正确地指出问题出在Simulation.cpp 第 426 行。跳到下面查看令人尴尬的解决方案。


可能你正在持有一个迭代器ce越过电话即可恢复。如果恢复碰巧删除了该项目,则迭代器将失效,并且任何将来的使用(例如尝试擦除它)都可能导致段错误。

如果我们能看到更多关于如何进行的背景知识将会有所帮助ce在调用recover之前和之后使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std 函数 std::_Rb_tree_rebalance_for_erase () 中的分段错误 的相关文章

随机推荐

  • 将 char* 复制到 char*

    这是我的代码的一部分 extern C REGISTRATION API int extreme char lKey string s1 char p NULL try ifstream myfile extreme txt int i 0
  • Android在没有edittext视图的情况下捕获硬件键盘事件

    如何在不使用 EditText 字段的情况下捕获硬件键盘事件 例如 在一个简单的活动中 在屏幕上显示一个正方形 当在滑动键盘上按下 B 时 我想将其变为蓝色 当按下 G 时 将其变为绿色 等等 我不需要颜色代码的帮助 只需要如何拦截按键 这
  • 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

    以下 verilog 源代码和 或测试平台可以很好地工作商业模拟器 iverilog https www edaplayground com x 3TuQ也形式化验证工具 yosys smtbmc https gist github com
  • ASP 服务器端代码如何损坏智能引用?

    我的公司刚刚将许多列从 varchar 转换为 nvarchar 现在看来 当我们将智能引号 即 ALT 0146 渲染到屏幕上 然后将其发送回 SQL Server 2000 数据库进行持久化时 智能引号会被损坏为 我的问题 ASP 服务
  • Paypal IPN 响应无法进入 Android 移动浏览器

    我是 Paypal 集成的新手 我正在尝试为我的 Android 应用程序实现 Paypal IPN 为了使其正常工作 我创建了一个网页 使用 PHP 并发送到 Paypal 沙箱帐户 方法 GET 以便我进行付款 我正在从中获取付款状态
  • 如何在C#中使用C++ DLL导出的接口指针

    我有一个用 C 编写的 DLL 它导出一个函数 CreateRisk 该函数返回一个接口指针 如下 extern C declspec dllexport IRisk stdcall CreateRisk return new Risk I
  • Sweet Alert 带有 href 的删除确认

    我使用 PHP 和 Sweet Alert 进行删除确认 问题是它在显示甜蜜警报之前就被删除了 这是我的 HTML 其中使用 PHP div class delete a href i class far fa trash alt i a
  • 值构造函数的别名

    是否可以为值构造函数定义别名 上下文是这样的 我正在编写一个程序 它将原始递归函数实现为图灵机 为此 我正在使用一元整数编码 我的图灵机类型定义如下 definition of a Turing machine data TuringMac
  • WSFederationAuthenticationModule v/s SessionAuthenticationModule

    根据文档 这两个模块都将用于创建 IClaimsPrincipal 的实例 我不明白为什么 WIF 费心使用 2 个 HttpModules 而不是 1 个 抱歉 我是 WIF 新人 最大的区别在于 WSFederationAuthenti
  • 禁用 JShell 历史记录

    默认情况下 JShell 启用所有键入内容的持久历史记录 可以通过按向上箭头来调用 关闭此 功能 的设置在哪里 另外 我如何清除当前历史记录 也许我比较笨 但是我不明白这个命令 reset似乎什么也没做 另外 我如何清除当前历史记录 我提出
  • 为什么用Java VisualVM监控Tomcat时堆空间不断增大?

    我有一个在 Tomcat 中运行的 JRubyOnRails 应用程序 浏览到我的应用程序 localhost 登录然后什么都不做后 堆空间似乎在不断增长 这正常吗 如果我按 执行 GC 它会再次下降 我想知道如果我将其保留到其达到计算机
  • Findbugs android gradle 插件

    我有一个安卓项目 我想介绍findbugs在我的项目中作为 gradle 插件 我尝试编辑项目的build gradle如下 buildscript repositories mavenCentral maven url https mav
  • Intent.EXTRA_EMAIL 未填充“收件人”字段

    我正在尝试使用intent questions tagged intent从我的应用程序发送电子邮件 但电子邮件的 收件人 字段不会填充 如果我添加代码来填写主题或文本 它们就可以正常工作 仅 收件人 字段不会填充 我也尝试将类型更改为 t
  • 从文件中的每一行创建一个字典

    我正在尝试从这个文件创建一个字典 键是第一个单词 值是后面的所有单词 andrew fred fred judy andrew fred george judy andrew john george 这是我的代码 follows file
  • AngularJS - 启用 HTML5 模式页面刷新而不会出现 404 错误 [重复]

    这个问题在这里已经有答案了 我也尝试通过设置 locationProvider html5Mode true 在 ui routing 和 base href 中它删除了哈希值 但在刷新时它给出了404错误 请帮帮我 正如其他人所说 启用
  • 在重复的动态类型部分视图中从匿名类型属性发出 HTML 字符串

    我将匿名类型传递到动态部分视图中作为 model 其中一个属性是包含一些 HTML 的字符串 当我使用HtmlHelper方法来呈现属性 Razor 引擎正在对字符串进行编码 从而在页面上生成文字文本 i text i 在这种情况下 而不是
  • PowerShell 舍入和格式浮点到最多 2 位小数?

    我发现了很多东西可以将浮点数格式化为常见的已知数字 但是如何将浮点数格式化为最多 2 位小数 但前提是需要小数 例子 1 11 not 1 111 1 12 it was 1 116 round up 1 1 not 1 10 1 not
  • 逐行比较 2 个数据帧的随时间分析

    这是我正在使用的数据框的一小部分 以供参考 https i stack imgur com 7fdwL jpg我正在 R 中使用一个数据框 MG53 HanLab 其中有一列时间 几列名称为 MG53 的列 几列名称为 F2 的列以及几列名
  • 有没有办法让 git 忽略整个分支?

    这可能违背了 git 的设计理念 但是 在我的组织中 我不断地删除数千个开发人员分支 例如Dev
  • std 函数 std::_Rb_tree_rebalance_for_erase () 中的分段错误

    请注意未来的读者 不出所料 错误出现在我的代码中 而不是 std Rb tree rebalance for erase 我对编程有点陌生 不确定如何处理似乎来自 std 函数的分段错误 我希望我做了一些愚蠢的事情 即滥用容器 因为我不知道