delphi - 为什么调用GetMem会导致内存泄漏?

标签 delphi

我有这段代码,看看我的前景窗口是否为SDImainframe。

Function Active_window_mf() :Boolean;
var
  FromClass: PChar;
begin

  MFhandle := GetForeGroundWindow;
  GetMem(FromClass, 100);
  GetClassName(MFhandle, PChar(FromClass), 800);
  if StrPas(FromClass) = 'SDIMainFrame' then
    result := true;
end;


但是,MADExcept报告Getmem函数存在问题。有人可以建议,我的代码有什么问题吗?

最佳答案

您的代码中存在三个问题。首先,如果分配内存(GetMem),则需要释放它(FreeMem):

GetMem(p, 1024);
try
  // Do sth with the memory
finally
  FreeMem(p);
end;


其次,我看不到100800之间的关系。其实你说谎。您分配一个100字节的缓冲区,然后告诉Windows它足以容纳800个Unicode字符。

第三,除非比较为真,否则该函数的返回值是不确定的。因此,您需要将result := false添加到过程的开头,或将最后两行(在end;之前)替换为

result := string(FromClass) = 'SDIMainFrame'


无论如何,最好不要使用GetMem。我会这样:

var
  CN: array[0..256] of char;
begin
  GetClassName(MFhandle, CN, 256)


另外,您应该检查是否有错误。如果GetClassName返回0,则发生错误。因此,您可以做类似的事情

function Active_window_mf(): boolean;
var
  CN: array[0..256] of char;
begin
  result := false;
  if GetClassName(GetForegroundWindow, CN, 257) > 0 then
    result := string(CN) = 'SDIMainFrame';
end;


更新:根据David关于抽象级别的出色观点,最好这样做:

function ClassNameFromHWND(const Handle: HWND): string;
var
  CN: array[0..256] of char;
begin
  result := '';
  if GetClassName(Handle, CN, 257) > 0 then
    result := CN;
end;

function Active_window_mf(): boolean;
begin
  result := ClassNameFromHWND(GetForegroundWindow) = 'SDIMainForm';
end;

关于delphi - 为什么调用GetMem会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343154/

相关文章:

delphi - 使用 TInvokeableVariantType 创建动态过程

delphi - VCL/Delphi/BCB-我应该使用哪种IDE/语言?

delphi - 如何在Delphi XE5中仅将输入限制为字母?

delphi - 如何实现多次Undo/Redo?

delphi - 我可以将某个对象的类注释为类型吗?

delphi - 只允许字符串中的某些字符

delphi - 西雅图的 UDP 与 Delphi 7

delphi - Delphi和SAPI

delphi - 监控 Delphi 应用程序中的内存使用情况

delphi - 任何人都可以使用GetIt!在 Delphi 10.4.1 中安装任何产品?