Delphi指针内存和释放

3

我正在使用自定义的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个回答

7
是的,就内存管理而言,您的方法是正确的。New和Dispose可以正确处理托管类型。这确实是它们存在的原因。
一些细节:
检查PostMessage的返回值。如果失败,则消息未发布,线程需要释放内存。 不要将窗体句柄用作接收者。存在竞争条件。窗体的窗口可能与您同时重新创建。然后消息将丢失。或者更糟糕的是,如果句柄被重用,则会将消息传递到不同的窗口。或者更糟糕的是,窗口可能在错误的线程上重新创建。相反,请使用AllocateHWnd创建一个您可以控制其生命周期的窗口句柄。 您的try/finally是错误的。try应该出现在资源获取之后。这是我们在这里看到的最常见的错误之一。在您的代码中,它可能是无害的,因为赋值不能引发异常,但准确性仍然值得注意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接