Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
1-1148703455
tio
2006-05-27 08:17
2006.07.16
MDI правильное закрытие окон и исчезновением их


3-1147627956
drucha
2006-05-14 21:32
2006.07.16
создание бд interbase


8-1138909150
Flint-1983
2006-02-02 22:39
2006.07.16
mp3 файлы


2-1151673095
Vitalik__
2006-06-30 17:11
2006.07.16
приложение для интернета


2-1151493908
shart
2006-06-28 15:25
2006.07.16
Как послать сообщение клиенту (Indy 9, Tcp)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский