Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2011, 15:29   #1
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
Вопрос Освобождение памяти от картинки по указателю

Есть 2 структуры:

Код:
  DTFEDIT = record
    StrType: String;
    Img: TImage;
    Commands: Array [0..2] of String;
    StartX,StartY,Width,Heigth: Integer;
    ImgPath: String;
    Index, FontSize: Integer;
    RGBValues: Array [0..2] of Integer;
    UnkCommand: String;
    UnkValues: Array [0..2] of Integer;
  end;

...

  DTFIMAGEPICTURE = record
    StrType: String;
    Img: TImage;
    Commands: Array [0..2] of String;
    StartX, StartY, Width, Height: Integer;
    OverAll,SomeValue: Integer;
    ImgPath: String;
  end;

  PIB = ^DTFIMAGEPICTURE;
  PEDIT = ^DTFEDIT;
Далее идет процедура освобождения памяти от загруженных в Img картинок:
Код:
procedure ListFree(var sList: TList);
var ib: PIB;
    edt: PEDIT;
begin
  for i := 0 to sList.Count - 1 do begin
    sib := sList.Items[i];
    if sib^.StrType = 'EDIT' then begin
      edt := sList.Items[i];
      if edt^.Img <> nil then edt^.Img.Free;
    end;   
    if sib^.StrType = 'IMAGEPICTURE' then begin
      ib := sList.Items[i];
      if ib^.Img <> nil then ib^.Img.Free;
    end;
  end;
end;
В случае с edt картинка освобождается без багов, когда дело доходит до ib, то вылезает Access Violation. В чем может быть проблема?
JoLan вне форума Ответить с цитированием
Старый 02.05.2011, 15:50   #2
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Покажите код заполнения списка.
eduard93 вне форума Ответить с цитированием
Старый 02.05.2011, 15:53   #3
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

А память для структуры ib была выделена? Делается при помощи New или GetMem
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 02.05.2011, 17:08   #4
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Для всех структур в начале парсинга указано:
Код:
var LEDIT: PEDIT;
begin
  New(LEDIT);
  mList.Add(LEDIT);
Ну естественно для каждого типа своя переменная.
JoLan вне форума Ответить с цитированием
Старый 02.05.2011, 19:15   #5
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Тогда может удаляемый объект просто не был создан?
eduard93 вне форума Ответить с цитированием
Старый 03.05.2011, 00:06   #6
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Если бы он просто не существовал, в таком случае он был равен nil. В том и дело, он создан, указатель при дебаге явно указывает на картинку, по экспанду видно, что это компонент.
JoLan вне форума Ответить с цитированием
Старый 03.05.2011, 00:23   #7
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Может FreeAndNil поможет?
_Engine_ вне форума Ответить с цитированием
Старый 03.05.2011, 09:28   #8
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

В который раз пишу вперед включения мозга и чтения документации. Компоненты и правда не существовали, а в указателях был рандомный адрес. Проблему решил добавив во все структуры Exists: Boolean и менял значение в зависимости от удачной/неудачной загрузки.
JoLan вне форума Ответить с цитированием
Старый 03.05.2011, 17:12   #9
JoLan
Delphi XE7
Пользователь
 
Аватар для JoLan
 
Регистрация: 26.07.2010
Сообщений: 74
По умолчанию

Теперь новая проблема, память освобождается не полностью. Как можно освободить целиком от загруженной структуры, приведенной выше?
JoLan вне форума Ответить с цитированием
Старый 03.05.2011, 18:44   #10
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Наверное нужно поискать пару функции New.
eduard93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36