C++ 动态内存分配到指向对象的指针数组

C++ 动态内存分配到指向对象的指针数组,c++,pointers,object,dynamic,C++,Pointers,Object,Dynamic,我有一个名为学生的班 class Student { string name; unsigned long int ID ; string email; unsigned short int year; public : Student() // Constructor string getName(void); unsigned long int getID(void); string

我有一个名为学生的班

class Student
{   string name;
    unsigned long int ID ;
    string email;
    unsigned short int year;
    public : 
         Student() // Constructor
         string getName(void);
         unsigned long int getID(void);
         string getEmail(void);
         unsigned short int getYear(void);   
{
和另一个名为eClass的类

class eClass {
 private:
 string eclass_name;
  Student* students[100];
  unsigned int student_count;

   public:
    eClass(string name)
    {
        student_count  =0 ; 
        eclass_name = name  ; 
    }

        bool exists(Student obj)
    {
        unsigned long int code = obj.getID();
        bool flag = TRUE ;
        for (unsigned int i = 0 ; i<=student_count ; i++ )
        {
            unsigned long int st = (*students[i]).getID();
            if (code==st)
            {
                flag = FALSE;
            }
        }
        return flag;
    }


        void add(Student& obj)
    { 
        bool res = exists(obj);
        if (res)
        {
            students[student_count] = new Student(); //probably the problem is here
            *students[student_count] = obj ;  
            student_count++ ; 
        }
    }

    string getEclassName(void) { return eclass_name; }
    unsigned int getStudentCount(void) { return student_count; }
    Student getStudent(int i) { return *students[i-1]; }


     };    
基本上,我有一个指向学生对象的指针数组,每次我想添加一个新的学生对象时,我都要动态分配内存

当我编译时,我没有得到任何错误,但当我试图运行程序时,我得到的唯一结果是“program_name.exe”停止运行

我很确定这个问题与内存分配有关,但我无法找到它并解决它


有什么建议吗

首先,您应该初始化所有指向NULL或nullprt的学生指针。这不是严格需要的,但却是一个很好的习惯。你以后会感谢你自己的

第二,如果学生存在,为什么返回false?我觉得有点困惑。此外,在您发现您的学生存在后,您可以使用
break
语句;不需要检查其余的


此外,在您的add上,您可能需要检查以确保您的学生不超过100人。这将覆盖内存,并会发生不好的事情。

存在
中的主要错误是循环使用未初始化的指针走得太远。但是,
exists
按值获取其输入也是非常糟糕的风格。解决这两个问题:

bool exists(Student const& obj)
{
    unsigned long int code = obj.getID();
    bool flag = TRUE ;
    for (unsigned int i = 0 ; i<student_count ; i++ )
    {
        unsigned long int st = (*students[i]).getID();
        if (code==st)
        {
            flag = FALSE;
        }
    }
    return flag;
}

从我所看到的,上面的代码看起来不错;您可以发布
Student
的实现吗?为什么要使用指向
Student
s的指针?只需存储
Student
s。根据您发布的内容,我估计主要的bug存在于
中(Student obj)
。无论如何,您不应该将值传递给该函数(但我认为这不是主要的bug)。将
exists
的实现添加到您的帖子中。主要嫌疑犯是
exists
。(旁注:
exists
如果学生不存在,返回
true
是非常违反直觉的。)我编辑并添加了学生类和exist函数。。。使用指针不是我的选择……我们的教授让我们这样做注意使用
student\u count
来控制
student
的使用。因此,如果正确使用了
student\u count
,则无需初始化
student
,并且当
student\u count
使用错误时,初始化
student
将不会有帮助。@JSF添加了一个关于这一点的解释。我知道这是不必要的,但这是一个很好的习惯,尽早开始。总是初始化一切;指针、INT、类、对话等等……如果我发表评论时你的第二句话在那里,我就不会发表评论了。但第一句中的“需要”一词仍然是错误的(与第二句相矛盾)。“应该”或“应该”将涵盖它。正如你所评论的,我正在改变它。我想我已经消除了第一个需要。让我明白。哇…非常感谢我的朋友…我从来没有想到再多做一次循环会造成这么大的问题!!!
bool exists(Student const& obj)
{
    unsigned long int code = obj.getID();
    bool flag = TRUE ;
    for (unsigned int i = 0 ; i<student_count ; i++ )
    {
        unsigned long int st = (*students[i]).getID();
        if (code==st)
        {
            flag = FALSE;
        }
    }
    return flag;
}
unsigned long int getID() const;