gpt4 book ai didi

C++:访问冲突写入位置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:11 24 4
gpt4 key购买 nike

使用: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++:访问冲突写入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26468459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com