Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Delphi指针内存和释放_Multithreading_Delphi_Memory_Vcl - Fatal编程技术网

Multithreading Delphi指针内存和释放

Multithreading Delphi指针内存和释放,multithreading,delphi,memory,vcl,Multithreading,Delphi,Memory,Vcl,我正在使用自定义windows消息将信息从工作线程交换到主VCL线程中的窗体。每当我需要发送带有消息的数据时,我都会执行以下操作: type PntStr = ^string; 然后PostMessage() 在接收表格上 try myStrP := PntStr(MSG.LParam); myfunction(myStrP^); finally Dispose(myStrP); end; 这是处理指针分配的内存的正确方法吗?在指针上调用Dispose()是否会释放内存?是的

我正在使用自定义windows消息将信息从工作线程交换到主VCL线程中的窗体。每当我需要发送带有消息的数据时,我都会执行以下操作:

type
  PntStr = ^string;
然后PostMessage()

在接收表格上

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

这是处理指针分配的内存的正确方法吗?在指针上调用Dispose()是否会释放内存?

是的,您的方法在内存管理方面是正确的<代码>新建和处置正确处理托管类型。这就是他们存在的目的

一些细微差别:

  • 检查
    PostMessage
    的返回值。如果失败,则消息未发布,线程需要释放内存
  • 不要将窗体句柄用作收件人。有一个比赛条件。可以在发布邮件的同时重新创建表单窗口。那么消息就会丢失。或者更糟糕的是,如果句柄被重复使用,则会被传递到另一个窗口。更糟糕的是,窗口可能在错误的线程上重新创建。而是使用
    AllocateHWnd
    创建一个窗口句柄,您可以控制它的使用寿命
  • 您的
    try/finally
    错误。获取资源后,应出现
    try
    。这是我们在这里看到的最常见的错误之一。在您的代码中,它可能是良性的,因为赋值不能引发异常,但它仍然值得精确
try
  myStrP := PntStr(MSG.LParam);
  myfunction(myStrP^);
finally
  Dispose(myStrP);
end;