Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка при освобождении памяти 
V
    Опции темы
Lonley
Дата 6.11.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 7.10.2003
Где: северные ворота М урманск

Репутация: нет
Всего: 4



ПРИВЕТ ВСЕМ.....
У меня в буфере находится некая информация
причем строчного формата т.е. для вывода на экран smile 
не типа String
-----------------------------
далее узнается размер инициализируется массив на данный размер
далле выделяется память VirtualAlloc и формируются строки типа Stringв ручную
-----------------------------
прописывается адресс строки в массиве И.....
-----------------------------
все какбы прекрасно строки выводятся все хорошо, но при
выходе из функции динамич массив освобождается тут и начинается
проблема 
-----------------------------
МНЕ конечно понятно что в строках (массива) указаны адреса на мою выделенную память,
но собственно какая разница память и память

-----------------------------
Код

.................
.................
.................
   SetLength(Result.aLP,c); //инициализация массива
   i  := 0;
   ii := 0;
{еужно посчитать весь размер подстроки 4 байта под хранения рамера + сама строка
т.е. 4 + [0] }
  lenbuff := 4 * cfild * c;
  asm
   mov esi,addr
   add esi,$0b
  end;
while i <> c do           //------------begin while RECORD
  begin
   while ii <> cfild do
    begin                 //------------begin while FIELDS
     asm
       xor ebx,ebx            //
       mov bl,byte ptr[esi];  //
       add lenbuff,bx         //
       add esi,ebx            //
       add esi,2              //
     end;
      inc (ii);
    end;                  //------END WHILE FIELDS
    ii := 0;
    inc(i);
  end;                    //------END WHILE RECORD
//------------------------------------------------------------------------------
  asm
   push  PAGE_READWRITE   //тип доступа
   push  MEM_COMMIT       //способ получения
   movzx eax,lenbuff      //
   push  eax              //его размер
   push  0                //указатель на базовый адрес
   call  VirtualAlloc     //
   
   cmp   eax,0            //
   je    _error           //
   mov buffstring,eax     //адресс буфера
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    mov   esi,addr            //
    add   esi,$0b             //
    mov   edi,buffstring      //
    movzx ecx,byte ptr [esi]  //
    mov   [edi],ecx
    add   esi,1               //
    add   edi,4               //
rep movsb                     //пересылаем саму строку
  end;
   Result.aLP[0].Name := '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@';
   d := @Result.aLP[0].Name;
  asm
   mov edi,buffstring
   mov esi,d
   add edi,4
   mov [esi],edi
 end;
//------------------------------------------------------------------------------
 MessageBoxA (HandleProcess,PAnsiChar(Result.aLP[0].Name),'HELLO',0);
_error:
 MessageBoxA (HandleProcess,'выделить память под строки не удалось','error',0);
_ok:
// TODO 2 -oILYA -cВпроцед : ПОлучаем данные из файла дописать
 asm
   push MEM_DECOMMIT
   push 0
   mov  eax,buffstring
   push eax
   call VirtualFree
 end;
 end;


Это сообщение отредактировал(а) Lonley - 6.11.2007, 18:42


--------------------
Земную жизнь пройдя до половины,
Я очутился в сумрачном лесу,
Утратив правый путь во тьме долины.
Каков он был, о, как произнесу,
Тот дикий лес, дремучий и грозящий,
PM MAIL ICQ   Вверх
bems
Дата 6.11.2007, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



у строки кроме самой строки и 4-х байт длины есть еще 4 байта счетчика ссылок и завершающий ноль (для совместимости с PChar). Я в асме не силен, поэтому не могу найти у тебя ошибку. Но вместо ручного создания string ты лучше объяви ее, сделай ей SetLength и скопируй в нее содержимое буффера. И VirtualAlloc не понадобится


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Lonley
Дата 7.11.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 7.10.2003
Где: северные ворота М урманск

Репутация: нет
Всего: 4



bems, 
-----
спасибо будем думать дальше  smile 


--------------------
Земную жизнь пройдя до половины,
Я очутился в сумрачном лесу,
Утратив правый путь во тьме долины.
Каков он был, о, как произнесу,
Тот дикий лес, дремучий и грозящий,
PM MAIL ICQ   Вверх
Rouse_
Дата 7.11.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Ты забыл вызов _LStrClr


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Lonley
Дата 8.11.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 7.10.2003
Где: северные ворота М урманск

Репутация: нет
Всего: 4



Rouse_, 
поясни... в отладчике она есть я видел....судя по Аббревиатуре очищает строку smile 


--------------------
Земную жизнь пройдя до половины,
Я очутился в сумрачном лесу,
Утратив правый путь во тьме долины.
Каков он был, о, как произнесу,
Тот дикий лес, дремучий и грозящий,
PM MAIL ICQ   Вверх
Lonley
Дата 9.11.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 7.10.2003
Где: северные ворота М урманск

Репутация: нет
Всего: 4



все разобрался.... если правильно сформировать строку то память освобождается без ошибок
------------
Код

OFFSET - 8 | OFFSET - 4 | OFFSET -0     |OFFSET + (OFFSET-4)|
------------------------------------------------------------
 FFFF FFFF  | размер      | начала стро | завершающий ноль с выравниванием |
------------------------------------------------------------

-------------------------------------
соответственно освбождать память самому не нужно т.к. при выходе из функции
программа попытаеться сама освободить память что вызовет ошибку
-------------------------------------
bems,   +1

Это сообщение отредактировал(а) Lonley - 9.11.2007, 20:37


--------------------
Земную жизнь пройдя до половины,
Я очутился в сумрачном лесу,
Утратив правый путь во тьме долины.
Каков он был, о, как произнесу,
Тот дикий лес, дремучий и грозящий,
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.