Память указателя Delphi и освобождение

Я использую пользовательские сообщения Windows для обмена информацией из рабочего потока с формами в основном потоке VCL. Всякий раз, когда мне нужно отправить некоторые данные с сообщением, я делаю это:

type
  PntStr = ^string;

затем var pointString : PntStr ; (...) Новый ( pointString ); pointString ^ : = mystring ; PostMessage ( frmDest . Handle , UM _ THREADMSG , UM _ MYEVENT1 , LPARAM ( pointString )); ()

try
  myStrP := PntStr(MSG.LParam);
  myfunction(myStrP^);
finally
  Dispose(myStrP);
end;

В принимающей форме

New

Это правильный способ справиться с памятью, выделенной указателем? Вызывает ли вызов Dispose () указатель на освобождение памяти?

multithreading,delphi,memory,vcl,

3

Ответов: 1


7 принят

Да, ваш подход правильный с точки зрения управления памятью. PostMessageи Disposeправильно справиться с управляемым типом. Это действительно то, что они существуют.

Некоторые нюансы:

  • Проверьте возвращаемое значение PostMessage. Если это не удается, сообщение не было отправлено, и поток должен избавиться от памяти.
  • Не используйте дескриптор формы в качестве получателя. Состояние гонки. Окно формы может быть воссоздано одновременно с отправкой сообщения. Затем сообщение будет потеряно. Или еще хуже, если ручка повторно используется. Или, что еще хуже, окно может быть воссоздано неправильно. Вместо этого используйте AllocateHWndдля создания дескриптора окна, жизнь которого вы контролируете.
  • Вы try/finallyошибаетесь. Он tryдолжен появиться после того, как ресурс был приобретен. Это одна из самых распространенных ошибок, которые мы видим здесь. В вашем коде это, скорее всего, доброкачественное, потому что назначение не может вызвать исключение, но оно все равно стоит быть точным.
Многопоточность, Дельфы, память, VCL,
Похожие вопросы
Яндекс.Метрика