Нарушение прав доступа написание расположение 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++: