Delphi 指针内存和释放
Delphi pointer memory and freeing
我正在使用自定义 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() 是否负责释放内存?
是的,您的方法在内存管理方面是正确的。 New
和 Dispose
正确处理托管类型。这确实是他们存在的目的。
一些细微差别:
- 检查
PostMessage
的 return 值。如果失败,则消息未发布,线程需要处理内存。
- 不要使用表单句柄作为收件人。存在竞争条件。表单的 window 可能会在您发布消息的同时重新创建。那么消息就会丢失。或者更糟的是,如果句柄被重新使用,则交付给不同的 window。或者更糟的是,window 可能会在错误的线程上重新创建。而是使用
AllocateHWnd
创建一个 window 句柄,其生命由您控制。
- 你的
try/finally
是错误的。 try
应该在获取资源后出现。这是我们在这里看到的最常见的错误之一。在您的代码中,它可能是良性的,因为赋值不会引发异常,但它仍然值得准确。
我正在使用自定义 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() 是否负责释放内存?
是的,您的方法在内存管理方面是正确的。 New
和 Dispose
正确处理托管类型。这确实是他们存在的目的。
一些细微差别:
- 检查
PostMessage
的 return 值。如果失败,则消息未发布,线程需要处理内存。 - 不要使用表单句柄作为收件人。存在竞争条件。表单的 window 可能会在您发布消息的同时重新创建。那么消息就会丢失。或者更糟的是,如果句柄被重新使用,则交付给不同的 window。或者更糟的是,window 可能会在错误的线程上重新创建。而是使用
AllocateHWnd
创建一个 window 句柄,其生命由您控制。 - 你的
try/finally
是错误的。try
应该在获取资源后出现。这是我们在这里看到的最常见的错误之一。在您的代码中,它可能是良性的,因为赋值不会引发异常,但它仍然值得准确。