读/写受保护的内存?

时间:2010-03-20 04:10:41

标签: c++ memory sdl

我正在尝试学习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背景,我迷路了......任何帮助都会非常感激。

4 个答案:

答案 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)

哎呀,语言混乱,当我这么困的时候,对我来说没有SO。

答案 3 :(得分:0)

在该功能中,实际上只有两件事可能出错,this不好或offset不好。由于你从offset得到new SDL_Rect();offset可能是一个坏指针的唯一方法就是如果new失败但不抛出,这看不太可能。

因此我们推断this是坏的。由于您从未显示用于分配此代码的代码,因此我猜您的代码看起来像这样。

  Vector2  * vec;
  vec->getSdlOffset(); // you crash here

您需要向我们展示您的代码如果您将向我们展示您创建Vector2对象的位置,我们可能会更具体