Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PChar утечка памяти


Bruce ©   (2006-04-02 20:35:00) 

Здарствуйте!
Есть ли утечка памяти в данном коде?
var
 //s1: string;
 pText, pResultText: PChar;
 ms: TMemoryStream;
begin
 Result := false;
 ms := TMemoryStream.Create;
 pResultText := nil;
 try
   pText := PChar(AText);
   ms.Write(pText^, Length(pText));
   ms.Position := 0;
   if ProcessData(ms) then // производим опр. действия над потоком
   begin
     GetMem(pResultText, ms.Size);
     ms.Read(pResultText^, ms.Size);
     AText := pResultText;
     Result := true;
   end;
 finally
   ms.Free;
   if pResultText <> nil then
     FreeMem(pResultText);
 end;


Bruce   (2006-04-02 22:17:00) [1]


> Джо ©   (02.04.06 21:10) [3]

а чего там опасаться то ) выделил память, скопировал память )


Рамиль   (2006-04-02 21:11:00) [2]


> Да, AText - это параметр var string, сделаю как вы советуете,
>  просто с опаской отношусь к манипуляциям памятью с типом
> string :)

смело


Джо   (2006-04-02 21:10:00) [3]

> [2] Bruce   (02.04.06 20:56)
> просто с опаской отношусь к манипуляциям памятью с типом
> string :)

Ого, а к конструкциям типа pResultText^ без опаски? ;)


Bruce   (2006-04-02 20:56:00) [4]


> begin...end ©   (02.04.06 20:50) [1]


> Если AText — это string, то я бы сделал примерно так:

Да, AText - это параметр var string, сделаю как вы советуете, просто с опаской отношусь к манипуляциям памятью с типом string :)


begin...end   (2006-04-02 20:50:00) [5]

> Bruce   (02.04.06 20:35)
> Есть ли утечка памяти в данном коде?

Нет. Но и необходимости использования PChar тоже нет.

Если AText — это string, то я бы сделал примерно так:

var
 ms: TMemoryStream;
begin
 Result := False;
 ms := TMemoryStream.Create;
 try
   ms.Write(AText[1], Length(AText));
   ms.Position := 0;
   if ProcessData(ms) then
   begin
     SetLength(AText, ms.Size);
     ms.Read(AText[1], ms.Size);
     Result := True
   end
 finally
   ms.Free
 end
end


Наверх

Титульная страница Поиск, карта сайта Написать письмо