[解決済み】C++: アクセス違反の書き込み場所
2022-02-12 18:53:21
質問
使用しています。MSVS2012
コード
elemalg.h
#include <vector>
#include <string>
#include <fstream>
class ElemAlg
{
private:
std::string difficultlyLevel, question, answerToRead;
std::vector<std::string> questions, answers;
std::vector<std::string> GetQuiz(int);
};
elemalg.cpp
#include "elemalg.h"
std::vector<std::string> ElemAlg::GetQuiz(int difficulty)
{
if (difficulty == 1) { difficultyLevel = "algE"; }
if (difficulty == 2) { difficultyLevel = "algM"; }
if (difficulty == 3) { difficultyLevel = "algH"; }
if (difficulty == 4) { difficultyLevel = "algVH"; }
std::ifstream fin(difficultyLevel + ".txt");
while (std::getline(fin, question)) { questions.push_back(question); }
fin.close();
std::ifstream fin2(difficultyLevel + "Answers.txt");
while (std::getline(fin2, answerToRead)) { answers.push_back(answerToRead); }
fin2.close();
return questions;
}
MathTutor.cpp
#includes etc
ElemAlg *ea;
ea->GetQuiz(1);
GetQuiz
は間違いなく 1 から 4 までの整数が渡され、これはメソッドが呼ばれる前に検証されます。
difficultyLevel
はヘッダーファイルで定義された文字列です。
コンパイラは、最初の
if
関数を使用します。
を削除すると
if
関数を定義し
difficultyLevel
をalgEとして、同じ問題をテストするためだけです。
を削除すると
difficultyLevel
としてファイルを開きます。
"algE.txt"
と
"algEAnswers"
を実行すると、同じ問題が発生しますが、コードがwhileループに入ると、別のメモリ位置に発生します。
解決方法は?
あなたの悩みはここにあります。
ElemAlg *ea;
ea->GetQuiz(1);
のインスタンスを作成しているわけではありません。
ElemAlg
そのため、初期化されていないポインタに対してメンバ関数を呼び出していることになります。
呼び出しているメンバ関数は仮想関数ではないので、コンパイラは実行時の検索を行う必要がありません。
GetQuiz
. しかし
this
のポインタはゴミになります。
ea
は初期化されていないので、メンバー変数にアクセスした瞬間 (
difficultyLevel
というように、未定義の動作が発生します。あなたの場合、未定義の動作はアクセス違反につながります。
を初期化するか
ea
:
ElemAlg *ea=new ElemAlg;
ea->GetQuiz(1)
または、ヒープに割り当てる必要がない場合は、そうしてください。
ElemAlg ea;
ea.GetQuiz(1)
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】C++の余分な資格エラー
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】システムが指定されたファイルを見つけられませんでした。