我正在尝试学习C ++,但我遇到了以下代码的问题。
class Vector2
{
public:
double X;
double Y;
Vector2(double X, double Y)
{
this->X = X;
this->Y = Y;
};
SDL_Rect * getSdlOffset()
{
SDL_Rect * offset = new SDL_Rect();
offset->x = this->X;
offset->y = this->Y;
return offset;
};
};
调用getSdlOffset()
时,Visual Studio抛出以下错误未处理的类型异常 'System.AccessViolationException' 发生在crossEchoTest.exe
其他信息:未经授权 读或写受保护的内存。这个 通常表明其他 记忆已腐败。
我有一个C#/ java背景,我迷路了......任何帮助都会非常感激。
答案 0 :(得分:2)
你从未初始化过X或Y ......那些价值观可能是什么?他们很可能指向00000X00(我生锈了这可能不是正确的地址,但你指的是你的程序分配空间之外的内存......因此“GPF”我被C / C ++“转换”为Java (超过11年前)所以我可以欣赏你对指针如何表现的想法 - 我可以向你保证,指针是C / C ++中最难理解的部分,所以你在学习中走在正确的轨道上。请记住,与Java / C#不同,C / C ++不会让你免于伤害自己或其他程序的操作系统内存空间/内存空间。我总是记得老师曾经在我学习C时告诉我的内容 - “With C你得到一把Kevlar靴子和一把枪,无论你是否在之前把你的靴子都放在脚下,你就可以了,因为你将射击自己有一点......“祝你学习C ++好运,只要坚持下去就不要气馁。
WM
答案 1 :(得分:0)
很确定Wintermute是对的。还有另一个SO问题得到了一些很好的答案。你可能想看看那里只是为了获得更多关于发生了什么的背景:
AccessViolationException in Release mode (C++)
希望它有所帮助!
答案 2 :(得分:0)
答案 3 :(得分:0)
在该功能中,实际上只有两件事可能出错,this
不好或offset
不好。由于你从offset
得到new SDL_Rect();
,offset
可能是一个坏指针的唯一方法就是如果new失败但不抛出,这看不太可能。
因此我们推断this
是坏的。由于您从未显示用于分配此代码的代码,因此我猜您的代码看起来像这样。
Vector2 * vec;
vec->getSdlOffset(); // you crash here
您需要向我们展示您的代码如果您将向我们展示您创建Vector2对象的位置,我们可能会更具体