![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PChar
dima © (2005-01-27 09:42:00)Добрый день....
Что то я не понимаю....
Вот реализая StrAlloc
function StrAlloc(Size: Cardinal): PChar;
begin
Inc(Size, SizeOf(Cardinal));
GetMem(Result, Size);
Cardinal(Pointer(Result)^) := Size;
Inc(Result, SizeOf(Cardinal));
end;
Т.е. выделеляется памяти на 4 байта больше, куда пишется размер блока. Потом эта величина используется при освобождении памяти StrDispose. А зачем все это? Ведь и так при резервировании блока(GetMem), менеджер памяти также добавляет свой "кусок" с размером выделяемого блока. И правомерно тогда использовать для выделения памяти под PChar GetMem, ReallocMem, FreeMem...Может для Delphi критичны эти 4 байта?
KSergey (2005-01-27 10:37:00) [1]Объяснение простое - см. наличие ф-ции StrBufSize
Poirot (2005-01-27 10:30:00) [2]Дружно смотрим структуру Манеджера Памяти Делфи. Очень много интересного найдёте:)
И ваш вопрос про то, что вы не указываете размер при FreeMem Тоже. Ибо его и не надо знать - он хранится в описателе выделенного блока памяти!
Kerk (2005-01-27 10:15:00) [3]dima (27.01.05 10:11) [2]
// 1024 указывать не надо, т.к. этот размер
в старом добром паскале надо. :)
видимо для совместимости такая ситуация.
а PChar можно использовать в любом блоке памяти, не важно чем выделенной.
REA (2005-01-27 10:14:00) [4]Там еще есть видимо ReferenceCount на строку, где указывается число ссылок на нее.
dima (2005-01-27 10:11:00) [5]Что значит слежу сам?
P: Pointer;
GetMem(P, 1024);
FreeMem(P); // 1024 указывать не надо, т.к. этот размер
// по такому же приницу хранится "перед указателем"
Kerk (2005-01-27 10:04:00) [6]В случае с GetMem, ReallocMem, FreeMem ты сам следишь за размером выделяемой памяти.. в StrAlloc это делает делфи.. вот и вся разница