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

C++ C++;:访问冲突写入位置,c++,access-violation,unhandled-exception,C++,Access Violation,Unhandled Exception,使用:MSVS2012 代码 elemalg.h getquick肯定传递了一个介于1和4之间的整数,在调用该方法之前会对此进行验证 difficultyLevel是头文件中定义的字符串 编译器在写入位置引发未处理的异常和访问冲突。。。当它点击第一个if函数时 如果我删除If函数并将difficultlevel定义为algE,只是为了测试相同的问题 如果我完全删除困难级别,只需以“algE.txt”和“algEAnswers”的形式打开文件,那么我会遇到相同的问题,但一旦代码进入while循环,

使用:MSVS2012

代码

elemalg.h

getquick
肯定传递了一个介于1和4之间的整数,在调用该方法之前会对此进行验证

difficultyLevel
是头文件中定义的字符串

编译器在写入位置引发未处理的异常和访问冲突。。。当它点击第一个
if
函数时

如果我删除
If
函数并将
difficultlevel
定义为algE,只是为了测试相同的问题

如果我完全删除
困难级别
,只需以
“algE.txt”
“algEAnswers”
的形式打开文件,那么我会遇到相同的问题,但一旦代码进入while循环,就会出现不同的内存位置。

您的问题就在这里:

ElemAlg *ea;
ea->GetQuiz(1);
您没有创建
ElemAlg
的实例,因此您正在对未初始化的指针调用成员函数

因为您正在调用的成员函数不是虚拟的,所以编译器不必执行任何运行时查找,这就是调用转到
getquick
的原因。但是,
this
指针将是垃圾(因为
ea
未初始化),因此当您访问成员变量(例如
difficultyLevel
)时,您将有未定义的行为。在您的情况下,未定义的行为会导致访问冲突

初始化
ea

ElemAlg *ea=new ElemAlg;
ea->GetQuiz(1)
或者,如果不需要在堆上分配,只需执行以下操作:

ElemAlg ea;
ea.GetQuiz(1)

什么是
difficultyLevel
确切地说?参数应该在函数内部通过断言进行验证,而不是在函数外部进行验证。如果问题是一个全局变量,我不知道你为什么要返回它。或者没有发生。您的ElemAlg对象无效。我认为您需要向我们发送有关代码的详细信息。@user3001499-
如果我删除If函数并将困难级别定义为algE只是为了测试相同的问题
您应该停止删除代码,而是保留原始错误代码,了解它为什么会给您带来问题并修复它。删除代码可能会隐藏错误,给你一种错误的感觉,你已经“用魔法”解决了问题。非常感谢你…我的程序与众不同,但它帮助我解决了问题。。。我只是用new关键字更改了内存分配语句,得到了与语句相同的错误:
MyQueue*newnode=(MyQueue*)malloc(sizeof(MyQueue))将上述语句更改为:
MyQueue*newnode=newmyqueue
ElemAlg *ea;
ea->GetQuiz(1);
ElemAlg *ea=new ElemAlg;
ea->GetQuiz(1)
ElemAlg ea;
ea.GetQuiz(1)