仪器社区

Delphi FreeMem 内存释放

zengyonggo 2013-03-25
释放了结构指针dispose,释放了内存FreeMem,为什么内存中还是有数据?如果用ZeroMemory代替FreeMem的话就成功对Delphi了解的不是很深,希望高手指点! 结构指针定义如下 PTTest = ^TTest; TTest = record pac: PAnsiChar; end; var A: PTTest; p... 释放了结构指针dispose,释放了内存FreeMem,为什么内存中还是有数据?如果用ZeroMemory代替FreeMem的话就成功对Delphi了解的不是很深,希望高手指点! 结构指针定义如下 PTTest = ^TTest; TTest = record pac: PAnsiChar; end; var A: PTTest; procedure TForm2.FormCreate(Sender: TObject); var pp: PAnsiChar; begin pp := '123456789'; New(A); // 申请内存空间 GetMem(A^.pac, 100); // 开辟100个内存空间 CopyMemory(A^.pac, pp, 9); // 复制内存 FreeMem(A^.pac); // 释放内存 Dispose(A); // 释放引用 这个应该是把A指向空地址吧? // 已经释放引用了,并且也 FreeMem 了 // 为什么还会弹出字符串呢? // 我希望的结果应该是出错,因为A这个结构不存在了! ShowMessage(string(A^.pac));end;
评论
全部评论
Sy__永远九姐姐
free掉了没说不能再次使用,但是如果这样子直接使用的话会出现意外的,因为你是在没有重新申请的情况下直接使用的,而实际上这块内存的管理已经不在App了

如果这个时候其他App或者其他进程/线程之类的能成功申请到这块Memory,那么大家就要conflict了

所以在free掉之后,你需要给这个指针赋值为nil的;这个时候有人直接再去使用,那就是空指针了
19 0 2018-05-10 0条评论 回复
jmcwk0513
procedure TForm2.FormCreate((Sender: TObject);
var
pp: PAnsiChar;
begin
pp := '123456789';
New(A); // 申请内存空间
GetMem(A^.pac, 100); // 开辟100个内存空间
CopyMemory(A^.pac, pp, 9); // 复制内存
FreeMem(A^.pac); // 释放内存

A := nil; //这样才真正的让A指向了空地址nil

if Assigned(a) then //空值测试 把这行注释掉一定报错
ShowMessage(string(A^.pac));end;
16 0 2013-03-27 0条评论 回复
ANNA0210
申请,指针指过去,记录引用
释放,减除引用,指针还在那里
没有记录可能就会被另一次申请去了,
并改了值,再访问,不是想要的结果
18 0 2013-03-26 0条评论 回复
xdev63
1、之所以不出错,是因为操作系统目前还没有使用这块内存,释放和重新利用是两个概念。
2、ZeroMemory与FreeMem根本就是两个不同功能的函数,一个清空内存(填充0),一个释放内存(把资源还给操作系统),代替个球?
3、CopyMemory仅仅是复制了9个字符,字符串必须以0结尾,你也没有置零。把 GetMem(A^.pac, 100)改成A^.pac := AllocMem(100)才对。
15 0 2013-03-27 0条评论 回复
您可能感兴趣的社区主题
加载中...
发布 评论