首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么调用GetMem会导致内存泄漏?

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

Stack Overflow用户
提问于 2013-03-12 00:03:10
回答 1查看 1.1K关注 0票数 1

我使用以下代码来查看我的前台窗口是否为SDImainframe。

代码语言:javascript
复制
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函数有问题。有没有人会说,我的代码出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-12 00:04:45

您的代码中有三个问题。对于第一个,如果您分配内存(GetMem),则需要释放它(FreeMem):

代码语言:javascript
复制
GetMem(p, 1024);
try
  // Do sth with the memory
finally
  FreeMem(p);
end;

第二个,我看不出100800之间的关系。事实上,你在说谎。您分配了一个100字节的缓冲区,然后告诉Windows它足够大,可以容纳800个Unicode字符。

对于第三个,函数的返回值是未定义的,除非比较结果为真。因此,您需要在过程的开头添加result := false,或者将最后两行(在end;之前)替换为

代码语言:javascript
复制
result := string(FromClass) = 'SDIMainFrame'

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

代码语言:javascript
复制
var
  CN: array[0..256] of char;
begin
  GetClassName(MFhandle, CN, 256)

此外,您还应该检查错误。如果GetClassName返回0,则发生错误。因此,您可以这样做

代码语言:javascript
复制
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;

更新:根据大卫关于抽象层次的优秀观点,这样做会很好:

代码语言:javascript
复制
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;
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15343154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档