【问题标题】:Read/Write protected memory?读/写受保护的内存?
【发布时间】:2011-01-29 17:27:06
【问题描述】:

我目前正在尝试学习 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;
    };
};

Visual Studio 在调用 getSdlOffset() 时抛出以下错误

未处理的类型异常 'System.AccessViolationException' 发生在crossEchoTest.exe中

其他信息:已尝试 读或写受保护的内存。这 通常表明其他 内存已损坏。

我有 C#/java 背景,但我迷路了...任何帮助将不胜感激。

【问题讨论】:

    标签: c++ memory sdl


    【解决方案1】:

    很确定 Wintermute 是正确的。还有另一个 SO question 得到了一些很好的答案。您可能想看看那里只是为了了解更多关于正在发生的事情的背景:

    AccessViolationException in Release mode (C++)

    希望对你有帮助!

    【讨论】:

    • 是的,他是对的!我没有正确创建 Vector2 类的一个实例。
    【解决方案2】:

    该函数实际上只有两件事会出错,this 不好或 offset 不好。因为你从new SDL_Rect(); 得到offset,所以offset 可能是一个坏指针的唯一方法是如果 new 失败但不抛出,这不太可能。

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

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

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

    【讨论】:

      【解决方案3】:

      哎呀,语言混乱,这么困的时候我没有。

      【讨论】:

        【解决方案4】:

        您从未初始化过 X 或 Y...您的这些值可能是什么?它们很可能指向 00000X00(我很生疏,这可能不是正确的地址,但是您被指向程序分配空间之外的内存……因此,我将 C/C++ “转换”为 Java 的“GPF” (超过 11 年前)所以我可以理解您对指针行为方式的想法——我可以向您保证,指针是 C/C++ 中最难理解的部分,因此您在学习中走在正确的轨道上。只是请记住,与Java/C#不同,C/C++不会让你不伤害自己或其他程序的OS内存空间/内存空间。我一直记得我学习C时老师曾经告诉我的一句话--《With C你有一双凯夫拉尔靴子和一把枪,你是否穿上靴子取决于你你射自己的脚之前,因为你向自己开枪有点……”祝你学习 C++ 好运,坚持下去,不要气馁。

        WM

        【讨论】:

        • 你是对的!我有一个尚未初始化的 Vector2 类的实例。感谢您为我指明正确的方向!
        猜你喜欢
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多