Нарушение доступа Delphi при назначении локальной переменной - PullRequest
10 голосов
/ 27 апреля 2010

Кажется, это самая простая вещь в мире, и я готов стащить с нее волосы.

У меня есть устройство, которое выглядит так;

Unit  myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;

const
//bunch of constants

var
//bunch of vars including
myCounter:integer;

Implementation
Uses //(all my uses)

// All of my procedures including

Procedure myProcedure;
   try
     // load items from file to TListBox - this all works
   except
   on EReadError do begin
     // handle exception
     end;
   end; //try



   myCounter:=0;  //  <--  ACCESS VIOLATION HERE
   while myCounter //...etc

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

Я вызываю процедуру изнутри обработчика кнопки OnClick из того же модуля, но независимо от того, откуда я ее вызываю, это вызывает исключение. Сумасшедшая вещь в том, что я делаю то же самое в дюжине других мест в единицах по всей программе без проблем. Почему здесь? Я в полной растерянности.

Ответы [ 5 ]

10 голосов
/ 27 апреля 2010

Read of address 00000008 означает, что вы читаете переменную со смещением 8 байтов от указателя nil . Это совсем не соответствует тому, что вы пытаетесь сделать здесь, поскольку вы пишете, а не читаете, и вы пишете константу, а не переменную, читаемую откуда-то.

Вы уверены, что именно эта строка вызывает исключение? Вы поставили точку останова на этой линии? Вы пытались переместить эту строку в начало процедуры?

Трудно быть уверенным без вашего реального кода передо мной, но если бы мне пришлось угадывать, я бы сказал, что строка до вызывает это исключение, а затем указатель инструкции имеет уже увеличен, поэтому Delphi выделяет следующую строку.

2 голосов
/ 27 апреля 2010

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

Просмотрите код ошибки в окне процессора и посмотрите, что на самом деле происходит.

1 голос
/ 27 апреля 2010

Назначение myCounter: = 0, выбрасывающее нарушение прав доступа, указывает на то, что либо сегмент данных, в котором хранятся глобальные переменные, был удален из памяти, либо регистры помещены в подпрограмму myProcedure.

Используйте представление CPU, чтобы увидеть, какие регистры используются для доступа к глобальному var, и затем отойдите назад, чтобы увидеть, куда эти / эти регистры идут не так.

1 голос
/ 27 апреля 2010

Вы используете заявления и смотрите на другой myCounter?

Какая-то часть вашего кода пишет в память, которую он не должен, или освобождает, а не должна, и что случайно это приводит к AV при доступе к этой конкретной локальной переменной?

0 голосов
/ 27 апреля 2010

Переместите MyCounter вверх по списку переменных и посмотрите, происходит ли это по-прежнему. Если проблема исчезнет, ​​посмотрите на объявленные выше переменные, где они у вас есть сейчас - вы можете найти что-то интересное, например, массив, растущий за его границей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...