Delphi指针内存和释放

时间:2016-10-13 12:22:57

标签: multithreading delphi memory vcl

我正在使用自定义Windows消息将工作线程中的信息交换到主VCL线程中的表单。每当我需要通过消息发送一些数据时,我会这样做:

type
  PntStr = ^string;

然后 PostMessage()

var
    pointString : PntStr;

(...)

New(pointString);
pointString^ := mystring;
PostMessage(frmDest.Handle, UM_THREADMSG, UM_MYEVENT1, LPARAM(pointString));

在接收表格上

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

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

1 个答案:

答案 0 :(得分:7)

是的,您的方法在内存管理方面是正确的。 NewDispose正确处理托管类型。这确实是他们的存在。

一些细微差别:

  • 检查PostMessage的返回值。如果失败,则消息未发布,线程需要处理内存。
  • 不要使用表单的句柄作为收件人。有竞争条件。您可以在发布消息的同时重新创建表单窗口。然后消息将丢失。如果重复使用手柄,或者更糟糕的是送到不同的窗口。或者更糟糕的是,可以在错误的线程上重新创建窗口。而是使用AllocateHWnd创建一个窗口句柄,您可以控制它的生命。
  • 您的try/finally错了。获取资源后应显示try。这是我们在这里看到的最常见的错误之一。在您的代码中,它可能是良性的,因为赋值不能引发异常,但仍然值得准确。