Форум программистов, компьютерный форум CyberForum.ru

Ошибка Access Violation - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 15:22     Ошибка Access Violation #1
Собственно, проблемма:
Есть класс, в котором есть переменные (3 шт):
C++
1
2
3
4
5
6
class wField
{
protected:
  int Vert;
  int Gor;
  char* *f;
В нем есть метод
C++
1
2
3
4
5
6
7
8
9
10
11
char CellState(int Row, int Col)
{
  if((Row>=Vert)||(Row<0)||(Col>=Gor)||(Col<0))
    return 'w';
  else if(f[Row][Col]=='0')
    return '0';
  else if (f[Row][Col]=='1')
    return '1';
  else
    return 'e';
}
Когда я пытаюсь скомпилировать проэкт с этим классом в С++Builder'е, я получаю ошибку:
"Access Violation at address 00403c4f in module #####. Read of address 000000c2."
При использовании класса в Visual Studio 10 метод не только работает, но еще и работает правильно.
В чем проблемма?
Заранее спасибо за ваши ответы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LK
Заблокирован
04.04.2012, 15:44     Ошибка Access Violation #2
Access Violation в деталях
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 15:52  [ТС]     Ошибка Access Violation #3
Знаю, читал. Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива. Что подтверждается нормальной работой в Visual Studio.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.04.2012, 16:20     Ошибка Access Violation #4
Тут важно следить, чтобы подобные методы вызывались гарантированно после выделения памяти под массив.
Цитата Сообщение от UFO94 Посмотреть сообщение
Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива.
А f при этом имеет валидное значение?
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 18:35  [ТС]     Ошибка Access Violation #5
Да, f валидно. Я пробовал ставить проверку на f==NULL, и она не срабатывала, т.е. память под f нормально выделялась
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.04.2012, 23:55     Ошибка Access Violation #6
Цитата Сообщение от UFO94 Посмотреть сообщение
Read of address 000000c2
Данный адрес говорит, что проблемы именно с указателем, в точности была попытка использовать какое-то значение в качестве указателя, которое указателем не является. Если Вы правильно определили метод, который эту ошибку вызывает, то тут возможны три варианта: f имеет невалидное значение, один из указателей f[row] имеет невалидное значение, либо row принимает недопустимое значение.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 00:12  [ТС]     Ошибка Access Violation #7
Спасибо, kazak, проблемма несколько сузилась. Указатели f[1] и f[9] (и только они) -- валидны, но при попытке использовать любой из элементов f[1][i], f[9][i] получаем Access Violation, только ошибка теперь 0000002D
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.04.2012, 00:45     Ошибка Access Violation #8
А можно глянуть код как выделяется память под **f?
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 01:02  [ТС]     Ошибка Access Violation #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wField(int VertSize, int GorSize, char* *g)
        {
    Vert=VertSize;
    Gor=GorSize;
    f=new char*[Vert];
    for(int i=0; i<Vert; i++)
    {
        f[i]=new char[Gor];
        for(int j=0; j<Gor; j++)
                {
                f[i][j]=g[i][j];
                }
    }
        if(f==NULL)
        wField(-1);
        }
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.04.2012, 01:13     Ошибка Access Violation #10
Вот что нашел на этом же форуме Access violation at address ?????? возможно поможет, думаю стоит обратить внимание на последние 2 сообщения.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 02:04  [ТС]     Ошибка Access Violation #11
Иными словами, использовать Debuger и программы, ему аналогичные... попробуем...
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.04.2012, 06:15     Ошибка Access Violation #12
Цитата Сообщение от UFO94 Посмотреть сообщение
Указатели f[1] и f[9] (и только они) -- валидны, но при попытке использовать любой из элементов f[1][i], f[9][i] получаем Access Violation
Как они могут быть валидными, если получаем ошибку?

Цитата Сообщение от UFO94 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wField(int VertSize, int GorSize, char* *g)
 {
 Vert=VertSize;
 Gor=GorSize;
 f=new char*[Vert];
 for(int i=0; i<Vert; i++)
 {
 f[i]=new char[Gor];
 for(int j=0; j<Gor; j++)
 {
 f[i][j]=g[i][j];
 }
 }
 if(f==NULL)
 wField(-1);
 }
Логичнее было бы проверять выделилась ли память непостредственно после выделения. Причем контролировать нужно все попытки выделить память. Плюс new может и не возращать нулевой указатель при неудаче.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 09:16  [ТС]     Ошибка Access Violation #13
Цитата Сообщение от kazak Посмотреть сообщение
Как они могут быть валидными, если получаем ошибку?
Я имел в виду, они не NULL.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
05.04.2012, 11:53     Ошибка Access Violation #14
Валидный означает, что указатель указывает на рабочую область памяти (valid - допустимый, действительный, достоверный, правильный, имеющий силу), а не имеет какое-то случайное значение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 14:35     Ошибка Access Violation
Еще ссылки по теме:

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA C++
C++ Ошибка Access violation writing location
C++ Массивы указателей и ошибка Access violation reading location

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
07.04.2012, 14:35  [ТС]     Ошибка Access Violation #15
Проблемма решена. Как оказалось, я забыл написать конструктор копий или оператор=, но использовал их в программе, вследствие чего класс корректно не копировался. Всем спасибо, кто помогал, тему можно закрывать.
Yandex
Объявления
07.04.2012, 14:35     Ошибка Access Violation
Ответ Создать тему
Опции темы

Текущее время: 04:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru