【问题标题】:Debug Assertion Failed C++ Forward List Merge调试断言失败 C++ 转发列表合并
【发布时间】:2020-08-18 09:24:00
【问题描述】:

您好,我在 VS 2019 中使用前向列表 STL 库。这是我的代码块:

forward_list<int> fl1;
    fl1.assign({ 1,2,3,4 });
    fl1.push_front(0);
    fl1.pop_front();
    cout << "Front " << fl1.front() << endl;
    forward_list<int>::iterator it4 = fl1.begin();
    it4 = fl1.insert_after(it4, 5);
    fl1.emplace_front(6);
    fl1.remove(6);
    forward_list<int> fl2;
    fl2.assign({ 9,8,7,6,6 });
    fl2.unique();
    fl2.sort();
    fl1.sort();
    fl2.reverse();
    fl1.merge(fl2);
   // fl1.clear();

    for (int i : fl1)
        cout << i << endl;

一旦程序到达合并行,它会给我一个“Debug Assertion Failed Line: 1492 Expression: Sequence not ordered” 我的代码只有 500 行,而代码本身出现在第 342 行我有那个 for 循环,它应该处理遍历 fl1: for (int i : fl1) cout

当我点击中止并看到调试错误时,它显示“Derektut.exe 中 0x5049F2F6 (ucrtbased.dll) 处出现未处理异常:将无效参数传递给认为无效参数致命的函数”

这是为什么?

【问题讨论】:

  • 要使用merge(),列表需要排序,而您的fl1 列表未排序。 See the documentation
  • 所以我添加了排序命令,它仍然给了我同样的错误@PaulMcKenzie
  • 您应该发布minimal reproducible example。首先,sort 函数按升序排序,而您的其他列表按降序排序。这将如何运作?
  • @PaulMcKenzie 实际上我最初有那个排序命令,但是从我的帖子中删除了它,因为当我检查它不是解决方案时,所以我把它删除了。这是我检查的第一件事
  • 如果列表未排序,则行为未定义,这意味着任何事情都可能发生,包括“工作”。所以你导师的代码是错误的,但他们不知道,因为编译器的运行时没有检查,也不需要检查。 Visual Studio 调试运行时库将实际检查列表是否已排序,并断言列表是否未排序。现在在 Visual Studio 下以“发布”模式运行您的代码——您看到错误了吗?如果不是,那么这就是您的导师正在处理的问题 - 代码错误,但没有迹象表明代码是错误的。

标签: c++


【解决方案1】:

std::forward_list::merge 要求对两个列表进行排序。调用 fl1.merge() 时,您的 fl1 列表未排序。在未排序的列表上调用 merge 是未定义的行为。

关于Debug Assertion错误:

由于这是 Visual Studio 生成的错误,因此在 Visual Studio 中,调试运行时将在调用 merge 时检查两个列表是否已排序,如果其中一个列表未排序,则将检查 assert()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2016-07-21
    相关资源
    最近更新 更多