Текущий архив: 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.5 MB
Время: 0.01 c