Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Освобождение памяти [D7, WinXP]


Страницы:   1 2

KygECHuK ©   (2006-04-14 20:21:00) 

При освобождении памяти, занятой при помощи функций GetMem или StrAlloc иногда у меня возникает ошибка доступа памяти. В чём может скрываться ошибка ?


KygECHuK   (2006-04-18 10:12:00) [21]

А вот на тебе Acces Violation в самый интересный момент - сиди думай. Уже месяц жизни потратил на выяснении причины. Короче дело обстоит так:
я использую буффер памяти, очень часто меняя его длинну. При очередной смене длинны появляется вышеупомянатая ошибка.

И почему ошибка появляется стабильно при выделении больши объёмов памяти до 3 Mb ?

Прочитал о MemoryManager - ответа нет.


Anatoly Podgoretsky   (2006-04-18 10:02:00) [22]

Тогда должно работать.


KygECHuK   (2006-04-18 09:51:00) [23]

>> Desdechado ©   (14.04.06 20:37) [1]
>> да в чем угодно:
>>1. неверный адрес
 Адресс верный, записан, проверен.
>>2. неверный размер
 Размер верен, записан, проверен для Getmem, а в StrAlloc он хранитсся в пямяти до массива
>>3. выделяем одним, освобождаем несовместимой функцией
 Для GetMem - FreeMem, а для StrAlloc - StrDispose
>>4. память там уже освобождена
 Непосредственнно перед освобождением происходит работа с массивом

>> FreeMem(ptV[,40]);//Вот тут возникнет ошибка.<<   еще бы :)

Исследовав проблему я пришел к выводу, что при выделении больших объёмов памяти ошибки происходят чаще.


Gero   (2006-04-15 01:47:00) [24]

> да в чем угодно

Поддерживаю.


Rial   (2006-04-14 20:45:00) [25]

Очень вероятна ситуация:

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

Type TV=Array[0..0]of Byte;
  pTV=^TV;

...
Var pV:pTV;
begin
GetMem(pV,40);
pV^[100]:=11;//Это, скрорее всего, прокатит.
...
FreeMem(ptV[,40]);//Вот тут возникнет ошибка.
end;


Desdechado   (2006-04-14 20:37:00) [26]

да в чем угодно:
1. неверный адрес
2. неверный размер
3. выделяем одним, освобождаем несовместимой функцией
4. память там уже освобождена
5. т.п.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо