Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
#1

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

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


http://www.cyberforum.ru/cpp-beginners/thread496779.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 15:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка Access Violation (C++):

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

Ошибка Access Violation при записи
void Texts :: setC_String() { str=strb; str->setC_String();//здесь...

__asm ошибка Access violation writing location
Код ниже выводит следующую ошибку "Unhandled exception at 0x004116a7 in...

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

Массивы указателей и ошибка Access violation reading location
#include "stdafx.h" #include <iostream> using namespace std; class...

14
LK
Заблокирован
04.04.2012, 15:44 #2
Access Violation в деталях
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 15:52  [ТС] #3
Знаю, читал. Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива. Что подтверждается нормальной работой в Visual Studio.
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
04.04.2012, 16:20 #4
Тут важно следить, чтобы подобные методы вызывались гарантированно после выделения памяти под массив.
Цитата Сообщение от UFO94 Посмотреть сообщение
Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива.
А f при этом имеет валидное значение?
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 18:35  [ТС] #5
Да, f валидно. Я пробовал ставить проверку на f==NULL, и она не срабатывала, т.е. память под f нормально выделялась
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
04.04.2012, 23:55 #6
Цитата Сообщение от UFO94 Посмотреть сообщение
Read of address 000000c2
Данный адрес говорит, что проблемы именно с указателем, в точности была попытка использовать какое-то значение в качестве указателя, которое указателем не является. Если Вы правильно определили метод, который эту ошибку вызывает, то тут возможны три варианта: f имеет невалидное значение, один из указателей f[row] имеет невалидное значение, либо row принимает недопустимое значение.
1
UFO94
264 / 253 / 23
Регистрация: 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
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.04.2012, 00:45 #8
А можно глянуть код как выделяется память под **f?
0
UFO94
264 / 253 / 23
Регистрация: 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
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.04.2012, 01:13 #10
Вот что нашел на этом же форуме http://www.cyberforum.ru/cpp-builder/thread289382.html возможно поможет, думаю стоит обратить внимание на последние 2 сообщения.
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 02:04  [ТС] #11
Иными словами, использовать Debuger и программы, ему аналогичные... попробуем...
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 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 / 23
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 09:16  [ТС] #13
Цитата Сообщение от kazak Посмотреть сообщение
Как они могут быть валидными, если получаем ошибку?
Я имел в виду, они не NULL.
0
kazak
3057 / 2378 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
05.04.2012, 11:53 #14
Валидный означает, что указатель указывает на рабочую область памяти (valid - допустимый, действительный, достоверный, правильный, имеющий силу), а не имеет какое-то случайное значение.
0
UFO94
264 / 253 / 23
Регистрация: 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) при обращении к элементу динамического массива структур
Добрый день! Все прекрасно работает если в структуре статические массивы. Но...

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA
Выдает ошибку raised exception class EAccessViolation with message 'Access...

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

Непонятная ошибка "Access violation writing location 0xcdcdcdd5"
#include &lt;iostream&gt; #include &lt;cstdlib&gt; struct Node{ int data; ...


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

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

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