Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Вопрос по ф-циям работы с памятью   Найти похожие ветки 

 
max999   (2006-06-16 11:36) [0]

Каков правильный порядок их вызова? Т.е. (как я понимаю):
1. LocalAlloc
2. LocalLock
3. LocalUnlock
4. LocalFree

Делаю LocalAlloc, потом еще раз LocalAlloc (другой размер памяти) - и все работает. Так и должно быть? Или вроде как ф-ция должна возвращать nil, если память по этому указателю уже выделена? Зачем тогда LocalReAlloc?
И вот еще, LocalFree не освобождает указатель, пока не напишешь прямо - hMem:=nil

Знаю, щас пошлют в Яндекс или Гугл... Был уже...


 
Сергей М. ©   (2006-06-16 11:41) [1]


> Или вроде как ф-ция должна возвращать nil, если память по
> этому указателю уже выделена?


По какому такому "этому указателю" ?
Среди параметров LocalAlloc() нет никаких указателей ..


> Зачем тогда LocalReAlloc?


Вот как раз LocalReAlloc() и принимает параметром тот самый указатель, который был возвращен одним из предшествующих вызовов LocalAlloc().


> LocalFree не освобождает указатель, пока не напишешь прямо
> - hMem:=nil


Ну это очевидная ерунда.


 
max999   (2006-06-16 11:44) [2]


> Среди параметров LocalAlloc() нет никаких указателей ..

Она возвращает the return value is the handle of the newly allocated memory object. Это указатель на выделеную память, так?


 
evvcom ©   (2006-06-16 11:48) [3]

> Это указатель на выделеную память, так?

Ну так, и?


 
Сергей М. ©   (2006-06-16 11:49) [4]


> Это указатель на выделеную память, так?


Нет, не так. Handle - это не указатель. Кроме того, заметь, возвращает, а не получает.

Указатель же на блок выделенной памяти возвращает ф-ция LocalLock(), получающая параметром тот самый хэндл, возвращенный ф-цией LocalAlloc().


 
max999   (2006-06-16 11:51) [5]

пишу такое:

// указатель
var
 Str: LPTSTR;

// выделяем память
Str:=LPTSTR(LocalAlloc(LPTR, 3));

// Записываем туда че-нибудь
Str:="123";

// Освобождаем
LocalFree(LocalHandle(Str));

// Проверяем
if (Str<>nil) then ... - оно не равно nil, почему?


Если без LocalFree написать Str:=nil, а потом снова Str:=LPTSTR(LocalAlloc(LPTR, 22)); - все работает, выделяет 22 символа


 
evvcom ©   (2006-06-16 11:52) [6]

> [3] evvcom ©   (16.06.06 11:48)
Оп-с. Конечно же, Handle не указатель.


 
max999   (2006-06-16 11:55) [7]


> Оп-с. Конечно же, Handle не указатель.

Ну да Бог с ним, с указателем... Просто очень хочеться понять как должно это все работать ПРАВИЛЬНО, у меня работает так как мне нужно, даже больше :) но подозреваю что могут быть проблемы вроде утечки памяти и т.п.


 
MBo ©   (2006-06-16 11:59) [8]

Есть ли необходимость использовать именно эти функции?
Почему бы не применять более удобные дельфийские?
(если не идет работа с API-функциями, требующими именно указанные методы работы с памятью)


 
evvcom ©   (2006-06-16 12:00) [9]

> Просто очень хочеться понять как должно это все работать
> ПРАВИЛЬНО

Посмотри LocalLock. Она принимает HLOCAL и возвращает нужный тебе указатель


 
Плохиш ©   (2006-06-16 12:02) [10]


> max999   (16.06.06 11:51) [5]


> // Освобождаем
> LocalFree(LocalHandle(Str));
>
> // Проверяем
> if (Str<>nil) then ... - оно не равно nil, почему?

Кто-то где-то обещал, что функции освобождения памяти обниляют указатели?

> Если без LocalFree написать Str:=nil, а потом снова Str:
> =LPTSTR(LocalAlloc(LPTR, 22)); - все работает, выделяет
> 22 символа

Код пионэра, приводящий к утечкам памяти.
PS. Может попросишь воспитательницу книжку-какую по основам прочитать для вас.


 
Сергей М. ©   (2006-06-16 12:04) [11]

var
 hMem: THandle;
 Str: PChar;
..

hMem := LocalAlloc(LPTR, 3);
Win32Check(hMem <> 0);

try

Str := LocalLock(hMem);
Win32Check(Assigned(Str));
try
..
finally
  LocalUnlock(hMem);
end;

hMem := LocalReAlloc(hMem, LPTR, 22);
Win32Check(hMem <> 0);

Str := LocalLock(hMem);
Win32Check(Assigned(Str));
try
..
finally
  LocalUnlock(hMem);
end;

finally
LocalFree(hMem);
end;


 
max999   (2006-06-16 12:09) [12]


> Код пионэра, приводящий к утечкам памяти.

От их то и не хочеться :)


 
Плохиш ©   (2006-06-16 12:11) [13]


> От их то и не хочеться

Так правило-то одно - "Взял, попользовал, верни на место".


 
max999   (2006-06-16 12:14) [14]

Подскажите еще, как имея
hMem: THandle;
Str: PChar;
Проверить что это в данный момент используеться? hMem<>nil ?


 
Плохиш ©   (2006-06-16 12:18) [15]


> max999   (16.06.06 12:14) [14]
> Подскажите еще, как имея
> hMem: THandle;
> Str: PChar;
> Проверить что это в данный момент используеться? hMem<>nil?

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


 
Сергей М. ©   (2006-06-16 12:19) [16]

Если уж приспичило, то

try
Win32Check(LocalSize(hMem) <> 0);
ShowMessage("Используется");
except
ShowMessage("Не используется");
end;

Хотя способ этот неприкрыто дилетантский - просто не теряй хэндл, тогда и проверять ничего не потребуется.


 
default ©   (2006-06-16 12:21) [17]

------------>offtopic
MBo ©   (16.06.06 11:59) [8]
Борис, традиция пятничных задачек канула в небытиё? есть желание 2-3 часа напрячь извилины


 
max999   (2006-06-16 12:32) [18]

После Unlock и Free LocalSize(hMem) не равно 0
:"-(
Знаю что я уже надоел, но программа показывает что оно не равно нулю! Может у меня Дельфя неправильная?


 
max999   (2006-06-16 12:37) [19]

И еще, я выделил памяти на 3 символа, попробовал записать туда 22 - получилось :) И прочиталось на ура! Разве так должно быть??


 
Eraser ©   (2006-06-16 12:38) [20]

> max999

var
 str: PChat;
begin
 str := nil;
 try
   GetMem(str, iSize);
   ...
 finally
   if str <> nil then
     FreeMem(str);
 end;
end;

не удивлюсь что это будет работать быстрее, чем прямое использование API.
и зачем себе лишних проблем создавать...


 
Eraser ©   (2006-06-16 12:39) [21]

> [19] max999   (16.06.06 12:37)


> И еще, я выделил памяти на 3 символа, попробовал записать
> туда 22 - получилось

только не удивляйся потом, если программа в самых неожиданных местах будет AV выдавать.. и это только в лучшем случае. В худшем - промолчит.


 
max999   (2006-06-16 13:05) [22]

Не работает.  LocalUnlock возвращает 0.
Дайте хоть ссылку на работающий пример. Можна на С++.


 
MBo ©   (2006-06-16 13:06) [23]

>default ©   (16.06.06 12:21) [17]
ОК, через полчасика сделаю, только контролировать ветку особо не смогу.


 
Плохиш ©   (2006-06-16 13:06) [24]


> max999   (16.06.06 12:37) [19]
> И еще, я выделил памяти на 3 символа, попробовал записать
> туда 22 - получилось :) И прочиталось на ура! Разве так
> должно быть??

Выдели памяти на твои 3 символа и сразу выдели ещё памяти, после записи 22 символов в первую область, прочитай данные из второй.



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
15-1150658905
zxcv
2006-06-18 23:28
2006.07.16
Nokia WAP Toolkit 2.0


15-1150452740
КаПиБаРа
2006-06-16 14:12
2006.07.16
Какая самая беззаботная профессия?


1-1149152229
Kolan
2006-06-01 12:57
2006.07.16
Как сделать объект управляющий другими потоком?


4-1143960606
Kor-win
2006-04-02 10:50
2006.07.16
drag-and-drop формы


2-1151392498
corvus
2006-06-27 11:14
2006.07.16
кнопки