Delphi: PByte и память

Delphi Rad 10.3 Com. Есть вот такой простой код:

...
Const StrA:ansistring='Test12345'; // 9 byte
Var buf:Pbyte; size:integer;
begin
size:=Length(StrA)*SizeOf(StrA[1]); // = 9
Getmem(buf,size); // 1 
buf:=pbyte(StrA); // 2 
FreeMem(buf);     // 3
end;
...

При выполнении получаем ошибку "Invalid pointer operation".

Варианты:

  • если убрать строку 2 или 3, то ошибки нет
  • если убрать строки 1,3 - ошибки нет (но подозреваю, что будет утечка памяти)
  • вместо строки 2 пробовал buf:=pointer(TEncoding.UTF8.GetBytes(stra)); - ошибка есть
  • вместо Getmem+Free mem пробовал конструкцию New+Dispose и Finalize - ошибка есть

Подозреваю, что проблема в строке 2.

Вопрос: Что не так в коде и откуда эта ошибка? Как сделать правильно?


Ответы (1 шт):

Автор решения: MBo
Getmem(buf,size);

выделяет память, buf на неё указывает

buf:=pbyte(StrA);

а тут указатель переназначается на адрес константной строки, выделенная ранее память "утекает"

FreeMem(buf);

Кто позволит фримему освободить память, выделенную программой под константы?

Наверное, вы подразумевали какую-то логику. Вот и опишите задачу, а не этот рандомный набор команд

→ Ссылка