Нарушение прав доступа написание расположение 0xcccccccc

за последние 2 дня я застрял на нарушении, которое я, похоже, не могу уйти. Я использовал точки останова и нашел, где ошибка, но я просто надеюсь, что один из вас узнает, в чем проблема, без необходимости копировать+вставлять весь мой код -.-

Я

исключение первого шанса на 0x1027cb1a (msvcr100d.dll) в побеге.ехе: 0xc0000005: нарушение доступа написание расположение 0xcccccccc. Необработанное исключение при 0x1027cb1a (msvcr100d.dll) в побеге.ехе: 0xc0000005: нарушение доступа написание расположение 0xcccccccc.

теперь быстрый поиск google заставляет меня думать, что происходит что-то странное. Все результаты поиска говорят о указателях, фактически не указывающих никуда (0xccccccccc-это низкий адрес памяти?).

Я еще не использовал указатели в своем коде, но в любом случае я вставлю функцию и укажу на строку, в которой возникает исключение (в жирный):

void mMap::fillMap(){
    for(int i = 0; i <= 9; i++){
        for(int z = 0; z <= 19; z++){
            Tile t1;    // default Tile Type = "NULLTILE"
            myMap[i][z] = t1;
        }
    }
}

теперь myMap представляет собой 2d-массив типа Tile. У меня была эта работа пару дней назад, пока я не добавил некоторые другие классы, и все это перестало работать!

4 ответов


либо неинициализированный указатель, либо указатель, хранящийся в освобожденной памяти. Я думаю cccccccc является первым и cdcdcdcd является вторым, но он зависит от реализации компилятора/библиотеки.

для вашего конкретного кода, наверное myMap еще не выделено, тогда myMap[0][0] приведет к попытке доступа к 0xcccccccc.


он также может случиться, что myMap является началом вашего класса, и указатель класса был неинициализированный:

class mMap
{
     Tile myMap[10][20];
public:
     void f() { myMap[0][0] = 0; }
};

mMap* what;
what->f(); // what is an invalid pointer

это происходит потому, что функция-член не является виртуальной, поэтому компилятор знает, какой код запускать, и передает указатель объекта в качестве скрытого параметра. В конце концов компилятор выдает вычисление типа:

this + offsetof(Whatever::myMap) + z * sizeof(myMap[0]) + i * sizeof(myMap[0][0])

this, будучи неинициализированным, составляет 0xcccccccc. Очевидно, что offsetof часть равна нулю, а i и z оба нуля в первый раз через цикл, так что вы получите 0xcccccccc + 0 + 0 + 0 как память адрес.


чтобы отладить это, используйте стек вызовов и найдите функцию, которая вызвала fillMap. Затем проверьте ту функцию, где указатели, используемые для доступа к элементу (->) вышел из.


в MSVC++ и в режиме отладки, отладки выделения памяти устанавливает все возвращается память 0xcccccccc, как способ найти случаи неопределенного поведения. По всей вероятности, вы никогда не инициализируется myMap, или некоторые из указателей внутри myMap. Проверьте код инициализации на наличие ошибок.


была аналогичная ошибка, когда я пытался заполнить строковое значение в элементе таблицы моего собственного типа класса с помощью for-loop. Я объявил 1000 элементов в этой таблице, поэтому я поставил что-то вроде этого:

    for (int i = 0; i <= 1000; i++)
    {
        TAble[i].name = "Some Guy";
        TAble[i].age = 4;
    }

к сожалению, как и в string, я, возможно, настаиваю на элементе fillinf, который не существует, witch-это элемент номер 1000 в таблице. Мне удалось решить эту проблему, изменив заголовок цикла, удалив знак равенства перед 1000.

пытаетесь ли вы не пытаетесь назвать то, чего не существует.


для всех ответов и комментариев, происходящих в этом вопросе, вот хорошие ссылки о заполнениях памяти в Visual C++: