cpp-尝试获取不在内存中的值的地址

时间:2016-03-28 12:54:39

标签: c++

我有一个包含以下私人成员的课程:

class Student
{
     public:
        Student(std::string name_ , int const id_);
        virtual ~Student();
        void addGrade(int const grade2add);//grade above 100

    private:
        std::string name;  //max 20 chars
        int const id; //5 digits, only digits
        std::vector<int> grades;
        static int  maxGrade;
        static int freq_grades[100];

};

我必须检查id的lentgh是否等于5并且只包含数字。 我用以下方式在构造函数中检查了它:

Student::Student(std::string name_, int const id_): name(name_), id(id_)
{
    string idStr=to_string(id);
    if (name.size()>=20)
    {
        throw(121);
        //cout<<"Name should be less than 20 chars"<<endl;
    }
    if (idStr.size()!=5)
    {
        throw(122);
         //cout<<"Id should be 5 nums"<<endl;
    }
    if (!all_of(idStr.begin(), idStr.end(),  ::isdigit))
    {
        throw(123);
    }
}

程序退出,因为大小的条件(输入是12345,所以它认为是合法的)。当我调试并观察isStr.size()时,我得到了#34;尝试获取不在内存中的值的地址。&#34;

2 个答案:

答案 0 :(得分:2)

这整个方法都很糟糕。

转换为字符串的整数永远不能包含除数字(或-)以外的任何内容。这是一个数字。另外,您可以用数字方式检查范围(并处理-作为其中的一部分)。因此,您的转换毫无意义,导致您的调试变得更加困难。

为什么不只是以下简单的功能?

Student::Student(const std::string& name_, int const id_)
  : name(name_)
  , id(id_)
{
    if (name.empty() || name.size() >= 20)
        throw std::runtime_error("Name must have 1-20 chars");

    // Require that the ID has exactly five decimal digits (also implies positive)
    if (id < 10000 || id > 99999)
        throw std::runtime_error("ID must have five decimal digits");
}

现在,当您的代码失败(无人可以重现)时,只需将id的值输出到控制台,或在id上设置监视,并将断点放在相关的条件块中。

答案 1 :(得分:0)

如果代码int cost id;编译了一些奇怪的东西,或许cost被定义为一个宏?无论如何,我在这里假设你真的是int const id;

所以我使用Visual C ++ 2015编译并运行了以下文件,它使用了输入&#34; John&#34;和&#34; 12345&#34;所以你不应该收到错误。

#include <string>
#include <algorithm>
#include <iostream>
using namespace std;

class Student
{
public:
    Student(std::string name_, int const id_);
private:
    std::string name;
    int const id;
};

Student::Student(std::string name_, int const id_) : name(name_), id(id_)
{
    string idStr = to_string(id);
    if (name.size() >= 20)
    {
        throw(121);
        cout<<"Name should be less than 20 chars"<<endl;
    }
    if (idStr.size() != 5)
    {
        throw(122);
        cout<<"Id should be 5 nums"<<endl;
    }
    if (!all_of(idStr.begin(), idStr.end(), ::isdigit))
    {
        throw(123);
    }
}

int main()
{
    string n = "";
    cin >> n;
    int i = 0;
    cin >> i;
    Student s {n, i};
    cin.ignore(2);
}

您使用的是哪种编译器/操作系统?其他C ++代码有效吗?也许您的编译器已损坏,或者您未显示的代码的其他部分出现问题。更多信息非常有用!