【发布时间】:2015-11-05 20:53:10
【问题描述】:
如何在 Delphi 中使用 HeapCreate 和 HeapAlloc 分配类?下面的例子只会崩溃。
program Project2;
uses
System.SysUtils,
System.Classes,
Winapi.Windows;
var
SL: TStringList;
Handle: THandle;
P: ^TStringList;
begin
Handle := HeapCreate(0, SizeOf(TStringList), SizeOf(TStringList));
P := HeapAlloc(Handle, 0, SizeOf(TStringList));
P.Add('some random string'); // crash
HeapFree(Handle, 0, @P);
end.
【问题讨论】:
-
你到底想在这里完成什么?
SL已经是一个指向TStringList实例的指针,所以P是一个指向一个TStringList 实例的指针。 -
@KenWhite 我正在尝试使用 TStringList?
-
这似乎充满了危险。听起来您真正想要的是 Delphi 的不同内存管理器。你试图做的事情是行不通的。考虑一下,即使您设法在新堆上创建
TStringList,其中的字符串仍将存在于共享堆上,因此您试图避免的任何争用都会失败(假设您就是这样)尝试做)。 -
你通过写
SL := TStringList.Create;来使用TStringList。您不需要HeapCreate或HeapAlloc。 Delphi 自动将它们放在应用程序的堆上。看来您需要的是 Delphi 教程。 -
@KenWhite 不,我认为他正试图故意创建第二个堆以在多线程上下文中使用 - 以避免 MM 争用。当然,这完全不是这样做的方式,但我不认为 OP 的困惑在于如何以标准方式创建对象。
标签: delphi delphi-xe4