-1

次の問題が発生しましたが、警告やエラーは表示されず、プログラムがクラッシュしただけです。

printAll()初期化後にメニューで実行するとdummyData()。新しい生徒を 1 人追加した瞬間、ループが始まりますstudentMenu()

ドメイン.h:

template <class T>
struct Array{
    int length;
    T * M;

    Array( int size ) : length(size), M(new T[size])
    {
    }
    ~Array()
    {
       delete[] M;
    }
};

template <class T>
struct Array{
    int length;
    T * M;

    Array( int size ) : length(size), M(new T[size])
    {
    }
    ~Array()
    {
       delete[] M;
    }
};

template <class T>
void addStudent(int a, int b, std::string c,Array <T> A){
    A.M[a].setStudent(a,b,c);
}

template <class T>
void DummyDataStudents(Array <T> A){
    for(int i=1; i<15; i++){
        A.M[i].setStudent(i, i,"student");
    }
    cout<<"Done Students"<<endl;
}

Controller.h

template <class T>
void _addStudent(Array <T> &A){
    int a,b;
    string c;
    cout<<"Enter ID:"<<endl;
    cin>>a;
    cout<<"Enter Group:"<<endl;
    cin>>b;
    cout<<"Enter Name:"<<endl;
    cin>>c;

    addStudent(a,b,c,A);
}

Student.cpp:

void Student::setStudent(int a,int b,string c){

this->ID = a;
this->group = b;
this->name = c;
}

メニュー.cpp:

void Menu::mainMenu(Array <Student> &DBst,Array <Assignment> &DBas){
showMainMenu();
int ret = Menu::intInputHandler();

switch(ret){
case 1:studentMenu(DBst,DBas);break;
case 2:assignmentMenu(DBst,DBas);break;
case 3:statsMenu(DBst,DBas);break;
case 4:_printAll(DBst,DBas);break;
case 0:break;
default:cout<<"Wrong option selected!";break;
}
Menu::mainMenu(DBst,DBas);
}



void Menu::studentMenu(Array <Student> &DBst,Array <Assignment> &DBas){
    showStudentMenu();
    int ret = Menu::intInputHandler();

    switch(ret){
    case 1:_addStudent(DBst);break;
    case 2:break;
    case 3:break;
    case 4:break;
    case 5:_printAllStud(DBst);break;
    case 6:break;
    case 0:mainMenu(DBst,DBas);break;
    default:cout<<"Wrong option selected!";break;
    }
    Menu::studentMenu(DBst,DBas);
}

Main.cpp:

int main(){
//Main function of the program

    DummyDataStudents(DBst);

    DBst.M[10].setStudent(1,10,"sadasd");     //works just fine
    DBst.M[10].printStudent();cout<<endl;

    Menu main;      
    main.mainMenu(DBst,DBas);

    DBst.~Array();
    DBas.~Array();

    return 0;
}

///これで十分理解できると思います。新しい生徒を追加すると、クラッシュするまでメニュー印刷のループが発生します。電話printall()すると、直接クラッシュします。長いコードで申し訳ありませんが、助けてください。

4

1 に答える 1

4

これは問題です:

template <class T> void addStudent(int a, int b, std::string c,Array <T> A){

これArray Aは値渡しされているため、コピーされています。つまり、コピー コンストラクターが定義されていないArrayため、同じ内部配列を指すインスタンスが 2 つあるため、デフォルトのコピー コンストラクターが生成されます。関数へのローカルのインスタンスによって内部配列が削除されているときに返されます。これにより、 の残りのインスタンスがダングリング ポインターのままになります。MArrayaddStudent()MArrayArray A

コピー コンストラクターと代入演算子を実装するか (これはやりたくないと思います) Array、コピー コンストラクターと代入演算子を宣言してコピー不可にしますprivate

于 2012-05-03T15:58:57.050 に答える