断言失败了2个不同的错误

时间:2016-03-12 00:00:47

标签: c++ vector iterator

我得到两个不同的断言错误。对于路径1,它表示行1169向量擦除迭代器外部范围。如果我执行路径2,则表示第70行向量迭代器不可解除引用。两者都是断言错误。

我对这些错误感到困惑,所以我甚至不确定这个程序是否可以用于预期的功能。

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

int _tmain()
{
    int adqv;
    vector<string> dvdtitle(100);
    vector<string>::iterator place;
    vector <string>::iterator del;
    string title;

    do{cout<< "welcome to your Dvd library!"
        && cout<< "     To add titles enter 1.                              To        delete titles enter 2.            Type 3 to quit"
        && cin>>adqv;

    switch (adqv)
    {case 1 : cout<<"Enter the title name"
        && cin >>title;

         break;
     case 2: 
         cout<<"enter the number of the title to be deleted.";
         cin>>*del ;

         break;
     case 3:
        {return 0;}
     default: cout<<"invalid choice";}
        dvdtitle.push_back(title);
        dvdtitle.erase(del);
        sort(dvdtitle.begin(), dvdtitle.end());
        cout<<"               These are your titles";
        for (place=dvdtitle.begin(); place!= dvdtitle.end() ; ++place);
        {cout<< *place;}
    } while (adqv !=3); 
}

1 个答案:

答案 0 :(得分:0)

看起来像你输入:
案例1:你设置了标题,但没有设置del
案例2:你设置del但不做任何设置标题

由于您没有给出这些初始值,因此在第一次循环迭代中保留开关后,其中一个不会被设置,但是您同时使用它们:

 dvdtitle.push_back(title);
 dvdtitle.erase(del);

在任何一种情况下,vector类都不能使用初始值,并且足够好抱怨而不是让未定义的行为(或其他令人讨厌的事情)发生。

您需要在开头初始化titledel,或者您需要在switch语句的case 1和case 2中为它们提供某种确定的值。

<小时/> 编辑:
我刚刚注意到,如果你碰到了switch语句的默认情况,那么它们中没有一个被定义,所以如果你选择处理你的switch中的赋值,你需要添加如何处理两个值的空值。默认。首先初始化它们可能会更容易。

您可能还希望将它们重置为您在每次循环迭代的最后或最开始时选择的默认状态。