Чтение / запись защищенной памяти? - PullRequest
1 голос
/ 20 марта 2010

Я сейчас пытаюсь выучить 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 бросает команду throw при следующем вызове getSdlOffset ()

.

Необработанное исключение типа 'System.AccessViolationException' произошло в crossEchoTest.exe

Дополнительная информация: Попытка чтение или запись защищенной памяти. это часто свидетельствует о том, что другие память повреждена.

У меня есть C # / Java-фон, и я потерян ... Любая помощь будет высоко ценится.

Ответы [ 4 ]

2 голосов
/ 20 марта 2010

Вы никогда не инициализировали X или Y ... какие у вас могут быть эти значения? Скорее всего, они указывают на 00000X00 (я не уверен, что это может быть неправильный адрес, но вы указали на память вне выделенного пространства ваших программ ... таким образом, "GPF", я был C / C ++ "конвертировать" в Java (более 11 лет назад), поэтому я могу оценить ваши идеи о том, как может вести себя указатель - я могу заверить вас, что указатели являются наиболее сложной частью понимания C / C ++, поэтому вы на правильном пути в своем обучении. имейте в виду, что в отличие от Java / C #, C / C ++ не удерживает вас от нанесения вреда себе или пространству памяти ОС / пространству памяти других программ. Я всегда помню, что учитель однажды сказал мне, когда я изучал C - "С C Вы получаете кевларовый ботинок и пистолет, решать вам, положите ли вы ботинок на до того, как выстрелите себе в ногу, потому что вы будете стрелять в себя в какой-то момент ... "Удачи вам в изучении C ++, просто держитесь и не расстраивайтесь.

WM

0 голосов
/ 20 марта 2010

На самом деле только две вещи могут пойти не так в этой функции: либо this - это плохо, либо offset - это плохо.Так как вы получаете offset из new SDL_Rect();, единственный способ, которым offset может быть плохим указателем, - это если новый провал, но не выдает, что маловероятно.

Таким образом, мы выводим, чтоthis это плохо.Поскольку вы никогда не показываете код, который используете для его выделения, я предполагаю, что ваш код выглядит примерно так:

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

Вам нужно показать нам код, где вы Если вы покажетегде вы создаете объект Vector2, мы можем быть более конкретны

0 голосов
/ 20 марта 2010

упс, языковая путаница, нет ТАК для меня, когда я такой сонный.

0 голосов
/ 20 марта 2010

Уверен, что Винтермут верен. Был еще один SO вопрос, который получил отличные ответы. Возможно, вы захотите заглянуть туда, чтобы получить дополнительную информацию о том, что происходит:

AccessViolationException в режиме выпуска (C ++)

Надеюсь, это поможет!

...