Нарушение прав доступа Delphi, присваивающее локальную переменную

Это походит на самую простую вещь в мире, и я готов вытащить волосы по ней.

У меня есть единица, которая похожа на это;

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

10
задан J... 27 April 2010 в 17:03
поделиться

5 ответов

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

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

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

10
ответ дан 3 December 2019 в 23:12
поделиться

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

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

1
ответ дан 3 December 2019 в 23:12
поделиться

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

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

1
ответ дан 3 December 2019 в 23:12
поделиться

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

0
ответ дан 3 December 2019 в 23:12
поделиться

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

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

2
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: