C++ 调试断言在Visual Studio中失败,但在联机IDE上运行正常

C++ 调试断言在Visual Studio中失败,但在联机IDE上运行正常,c++,C++,我的代码在联机IDE上运行时运行良好,但在visual studio上运行时由于调试断言错误而失败。错误可能在rand()函数中,因为当我专门使用随机整数值时,它工作得很好。我不明白为什么它不能在VS上运行 将显示以下消息: 另外,我想问一下如何调试这些错误,因为它们没有指定特定的代码实例 #include <iostream> #include <list> #include <cstdlib> //for rand() function

我的代码在联机IDE上运行时运行良好,但在visual studio上运行时由于调试断言错误而失败。错误可能在rand()函数中,因为当我专门使用随机整数值时,它工作得很好。我不明白为什么它不能在VS上运行

将显示以下消息:

另外,我想问一下如何调试这些错误,因为它们没有指定特定的代码实例

#include <iostream>
#include <list>
#include <cstdlib>          //for rand() function
using namespace std;
void display(list <int> &lst)
{
    list <int> ::iterator p;
    for (p = lst.begin(); p != lst.end(); p++)
    {
        cout << *p << " ";
    }
    cout << "\n\n";
}
int main()
{
    list <int> list1;           //empty list of zero length
    list <int> list2(5);        //empty list of size 5
    for (int i = 0; i < 3; i++)
    {
        list1.push_back(rand() % 100);
    }

    list <int> ::iterator p;

    for (p = list2.begin(); p != list2.end(); p++)
    {
        *p = (rand() % 100);
    }

    cout << "List1:  ";
    display(list1);
    cout << endl << endl;
    cout << "List2:  ";
    display(list2);
    cout << endl << endl;

    //Add two elements at the ends of list 1
    list1.push_back(200);
    list1.push_front(100);

    //Remove an element at the front of list 2
    list2.pop_front();

    cout << "Now list1:  ";
    display(list1);
    cout << "\n\n";
    cout << "Now list2:  ";
    display(list2);
    cout << "\n\n";

    list<int> listA, listB;
    listA = list1;
    listB = list2;

    //Merging two lists(unsorted)

    list1.merge(list2);
    cout << "Merged unsorted lists\n";
    display(list1);
    cout << "\n\n";

    //Sorting and merging
    listA.sort();
    listB.sort();
    listA.merge(listB);

    cout << "Merged sorted lists\n";
    display(listA);
    cout << "\n\n";

    //Reversing a list
    listA.reverse();
    cout << "Reversed merged list: \n";
    display(listA);

    return 0;
}
#包括
#包括
#include//for rand()函数
使用名称空间std;
无效显示(列表和lst)
{
列表::迭代器p;
对于(p=lst.begin();p!=lst.end();p++)
{

cout
merge
要求对列表进行排序(请参阅:)。在第一次调用
merge
时,列表未排序(列表仅在第二次调用之前排序)


<>调试模式下,微软C++标准库包括执行额外的运行时检查来执行不变量,例如“在线IDE”。可能将GCC与libstdc++或类似软件一起使用,通常不包括与Microsoft库相同级别的运行时检查,因此不会发现错误。

merge
要求对列表进行排序(请参阅:)。在第一次调用
merge
时,列表不会排序(列表仅在第二次呼叫之前排序)

<>调试模式下,微软C++标准库包括执行额外的运行时检查来执行不变量,例如“在线IDE”。可能将GCC与libstdc++或类似软件一起使用,通常不包括与Microsoft库相同级别的运行时检查,因此不会发现错误。

的文档说明:

异常安全
如果两个容器中的分配器比较不相等,如果comp没有定义严格的弱排序,或者如果容器元素 未按其排序,会导致未定义的行为
否则,如果比较引发异常,则容器将 处于有效状态(基本保证)。否则,如果出现异常 抛出时,容器中没有任何更改(强保证)

<> P>根据编译器的实现行为,在合并未排序列表时可能会有所不同。显然VisualStudio在C++模式下不需要(但允许)的调试模式下进行额外检查。 异常安全
如果两个容器中的分配器比较不相等,如果comp没有定义严格的弱排序,或者如果容器元素 未按其排序,会导致未定义的行为
否则,如果比较引发异常,则容器将 处于有效状态(基本保证)。否则,如果出现异常 抛出时,容器中没有任何更改(强保证)


根据编译器的实现行为,在合并未排序列表时可能会有所不同。显然VisualStudio在C++模式下不要求(但允许)的调试模式下进行额外检查。< /P>请至少将完整断言消息添加到您的问题中,并对其发生的行进行注释。“我还想问一下如何调试这些错误。。。"您可以使用调试器逐行检查代码,直到得到断言错误。我为错误添加了一个屏幕截图。请检查屏幕截图没有用处。它们无法从搜索引擎中搜索和索引。请以文本形式发布错误。我添加了一条粗体注释。请检查。请至少将完整的断言消息添加到您的问题,并在该行的具体位置进行评论。“另外,我想问一下如何调试这些错误…”您可以使用调试器逐行检查代码,直到得到断言错误。我为错误添加了一个屏幕截图。请检查屏幕截图没有用。它们无法从搜索引擎中搜索和索引。请将错误以文本形式发布。我添加了一条粗体注释。请检查。谢谢。这真的很有帮助。有没有办法然后是两个未排序的列表?我一直在寻找,这取决于您想要的行为,您应该使用
splice
insert
函数。
merge
根据定义将第二个列表保留为空。如果这是您想要的行为,那么您应该使用
splice
。如果这不是您想要的行为,请当你应该使用
insert
时。谢谢。这真的很有帮助。有没有办法合并两个未排序的列表?我正在寻找,根据你想要的行为,你应该使用
splice
insert
函数。
merge
将第二个列表定义为空。如果这是行为y如果需要,则应使用
splice
。如果这不是您想要的行为,则应使用
insert
#include <iostream>
#include <list>
#include <cstdlib>          //for rand() function
using namespace std;
void display(list <int> &lst)
{
    list <int> ::iterator p;
    for (p = lst.begin(); p != lst.end(); p++)
    {
        cout << *p << " ";
    }
    cout << "\n\n";
}
int main()
{
    list <int> list1;           //empty list of zero length
    list <int> list2(5);        //empty list of size 5
    for (int i = 0; i < 3; i++)
    {
        list1.push_back(rand() % 100);
    }

    list <int> ::iterator p;

    for (p = list2.begin(); p != list2.end(); p++)
    {
        *p = (rand() % 100);
    }

    cout << "List1:  ";
    display(list1);
    cout << endl << endl;
    cout << "List2:  ";
    display(list2);
    cout << endl << endl;

    //Add two elements at the ends of list 1
    list1.push_back(200);
    list1.push_front(100);

    //Remove an element at the front of list 2
    list2.pop_front();

    cout << "Now list1:  ";
    display(list1);
    cout << "\n\n";
    cout << "Now list2:  ";
    display(list2);
    cout << "\n\n";

    list<int> listA, listB;
    listA = list1;
    listB = list2;

    //Merging two lists(unsorted)

    list1.merge(list2);
    cout << "Merged unsorted lists\n";
    display(list1);
    cout << "\n\n";

    //Sorting and merging
    listA.sort();
    listB.sort();
    listA.merge(listB);

    cout << "Merged sorted lists\n";
    display(listA);
    cout << "\n\n";

    //Reversing a list
    listA.reverse();
    cout << "Reversed merged list: \n";
    display(listA);

    return 0;
}