1. ホーム
  2. c++

[解決済み] 「ベクトルを使った簡単なプログラム「プロセスがステータス -1073741819で終了しました

2022-02-27 15:10:53

質問内容

プログラムを実行すると、なぜか "Process terminated with status -1073741819" というエラーが出ます。code-blocks/コンパイラに何か問題があるためにこのエラーが出る人がいると読みました。私はcode::blocksとGNU GCCコンパイラを使用しています。

私のコードは、1週間に40時間の労働時間を格納するベクトルと、そのベクトルの中に、その時間に利用可能な5人を表す文字を格納するベクトルを作成します。

Schedule.cpp。

#include <iostream>
#include "Schedule.h"
#include <vector>
#include <string>

using namespace std;

/// Creates a Vector which holds 40 items (each hour in the week)
/// each item has 5 values ( J A P M K or X, will intialize as J A P M K)

vector< vector<string> > week(40, vector<string> (5));

Schedule::Schedule(){
        for (int i = 0; i<40; i++){
            week[i][0] = 'J';
            week[i][1] = 'A';
            week[i][2] = 'P';
            week[i][3] = 'M';
            week[i][4] = 'K';
        }
        // test 
        cout << week[1][3] << endl;
    }

ヘッダーファイルがあります。

#ifndef SCHEDULE_H
#define SCHEDULE_H
#include <vector>
#include <string>

using namespace std;

class Schedule
{
    public:
        Schedule();
    protected:
    private:
        vector< vector<string> > week;

};

#endif // SCHEDULE_H

main.cpp:

#include <iostream>
#include "Schedule.h"
#include <vector>
#include <string>

using namespace std;

int main()
{
    Schedule theWeek;
}

解決方法は?

これはコピーのバグではありません。

コンストラクタでメモリフォールトが発生しています。

例えば、あなたのcppでは、グローバルベクターweekを宣言していますが、コンストラクターではSchedule::weekにアクセスするため、コンストラクターではweekは隠されています。

あなたのcppは、次のようなものであるべきです。

// comment out the global declaration of a vector week ...
// you want a vector for each object instantiation, not a shared vector between all Schedule objects
// vector< vector<string> > week(40, vector<string> (5)); 


Schedule::Schedule()
{
    for (int i=0;i<40;i++)
    {
        vector<string> stringValues;
        stringValues.push_back("J");
        stringValues.push_back("A");
        stringValues.push_back("P");
        stringValues.push_back("M");
        stringValues.push_back("K");
        week.push_back(stringValues);
    }
}

ウィークベクターに初めてアクセスしようとしたときに、コード内でメモリフォールトが発生します。

 week[i][0] = 'J' ;

この行を呼び出した時点で、Schedule::weekベクトルには0個の要素が含まれています(つまりweek[i]はすでにfaultになっています)。