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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
#1

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

04.04.2012, 15:22. Просмотров 1389. Ответов 14
Метки нет (Все метки)

Собственно, проблемма:
Есть класс, в котором есть переменные (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 метод не только работает, но еще и работает правильно.
В чем проблемма?
Заранее спасибо за ваши ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 15:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка Access Violation (C++):

Ошибка Access violation writing location - C++
Структура и объявление массива: struct Particle { float X; float Y; float Dx; float Dy; float R; int SegCount; ...

Ошибка Unhandled Exception, Access Violation - C++
Странная проблема, на самом деле.. пишу следующее: #include &lt;fstream.h&gt; ... ofstream FileStream('data.txt');при выполнении пишет...

Ошибка Access Violation при записи - C++
void Texts :: setC_String() { str=strb; str-&gt;setC_String();//здесь указывает на ошибку str=strh; ...

__asm ошибка Access violation writing location - C++
Код ниже выводит следующую ошибку &quot;Unhandled exception at 0x004116a7 in cousach.exe: 0xC0000005: Access violation reading location...

ошибка Access violation reading location 0x00000066 - C++
Ошибка : Unhandled exception at 0x100e14cf (msvcr100d.dll) in 3.4.exe: 0xC0000005: Access violation reading location 0x00000066. ...

Массивы указателей и ошибка Access violation reading location - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class Number { public: int x; int calc(Number* start,...

14
LK
Заблокирован
04.04.2012, 15:44 #2
Access Violation в деталях
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 15:52  [ТС] #3
Знаю, читал. Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива. Что подтверждается нормальной работой в Visual Studio.
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
04.04.2012, 16:20 #4
Тут важно следить, чтобы подобные методы вызывались гарантированно после выделения памяти под массив.
Цитата Сообщение от UFO94 Посмотреть сообщение
Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива.
А f при этом имеет валидное значение?
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 18:35  [ТС] #5
Да, f валидно. Я пробовал ставить проверку на f==NULL, и она не срабатывала, т.е. память под f нормально выделялась
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
04.04.2012, 23:55 #6
Цитата Сообщение от UFO94 Посмотреть сообщение
Read of address 000000c2
Данный адрес говорит, что проблемы именно с указателем, в точности была попытка использовать какое-то значение в качестве указателя, которое указателем не является. Если Вы правильно определили метод, который эту ошибку вызывает, то тут возможны три варианта: f имеет невалидное значение, один из указателей f[row] имеет невалидное значение, либо row принимает недопустимое значение.
1
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 00:12  [ТС] #7
Спасибо, kazak, проблемма несколько сузилась. Указатели f[1] и f[9] (и только они) -- валидны, но при попытке использовать любой из элементов f[1][i], f[9][i] получаем Access Violation, только ошибка теперь 0000002D
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
05.04.2012, 00:45 #8
А можно глянуть код как выделяется память под **f?
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 01:02  [ТС] #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);
        }
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
05.04.2012, 01:13 #10
Вот что нашел на этом же форуме Access violation at address ?????? возможно поможет, думаю стоит обратить внимание на последние 2 сообщения.
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 02:04  [ТС] #11
Иными словами, использовать Debuger и программы, ему аналогичные... попробуем...
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
05.04.2012, 06:15 #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 может и не возращать нулевой указатель при неудаче.
1
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 09:16  [ТС] #13
Цитата Сообщение от kazak Посмотреть сообщение
Как они могут быть валидными, если получаем ошибку?
Я имел в виду, они не NULL.
0
kazak
3038 / 2359 / 157
Регистрация: 11.03.2009
Сообщений: 5,405
Завершенные тесты: 1
05.04.2012, 11:53 #14
Валидный означает, что указатель указывает на рабочую область памяти (valid - допустимый, действительный, достоверный, правильный, имеющий силу), а не имеет какое-то случайное значение.
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
07.04.2012, 14:35  [ТС] #15
Проблемма решена. Как оказалось, я забыл написать конструктор копий или оператор=, но использовал их в программе, вследствие чего класс корректно не копировался. Всем спасибо, кто помогал, тему можно закрывать.
0
07.04.2012, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 14:35
Привет! Вот еще темы с ответами:

Ошибка (access violation) при обращении к элементу динамического массива структур - C++
Добрый день! Все прекрасно работает если в структуре статические массивы. Но так уж получилось, что есть необходимость задавать размерность...

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA - C++
Выдает ошибку raised exception class EAccessViolation with message 'Access violation at address 004011FA... на строке { fputc (c,b);}....

Ошибка: Unhandled exception at 0x772115de in TimeShift.exe: 0xC0000005: Access violation reading location 0x00041000. - C++
всем привет! При использовании двумерного массива постоянно появляется ошибка :Unhandled exception at 0x772115de in TimeShift.exe:...

Непонятная ошибка "Access violation writing location 0xcdcdcdd5" - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; struct Node{ int data; Node *next, *prev; }; typedef Node...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru