我要发布
仪器网/ 仪器社区/ PAC/ Delphi FreeMem 内存释放

Delphi FreeMem 内存释放

zengyonggo    2013-03-25    PAC    浏览 407 次

释放了结构指针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__永远九姐姐 发布日期:2018-05-10
free掉了没说不能再次使用,但是如果这样子直接使用的话会出现意外的,因为你是在没有重新申请的情况下直接使用的,而实际上这块内存的管理已经不在App了

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

所以在free掉之后,你需要给这个指针赋值为nil的;这个时候有人直接再去使用,那就是空指针了
全部评论
jmcwk0513 发布日期:2013-03-27
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;
ANNA0210 发布日期:2013-03-26
申请,指针指过去,记录引用
释放,减除引用,指针还在那里
没有记录可能就会被另一次申请去了,
并改了值,再访问,不是想要的结果
xdev63 发布日期:2013-03-27
1、之所以不出错,是因为操作系统目前还没有使用这块内存,释放和重新利用是两个概念。
2、ZeroMemory与FreeMem根本就是两个不同功能的函数,一个清空内存(填充0),一个释放内存(把资源还给操作系统),代替个球?
3、CopyMemory仅仅是复制了9个字符,字符串必须以0结尾,你也没有置零。把 GetMem(A^.pac, 100)改成A^.pac := AllocMem(100)才对。
最新主题
相关版块
我要评论
X您尚未登录
账号登录
X您尚未登录
手机动态密码登录
X您尚未登录
扫码登录
官方微信

仪器网微信服务号

扫码获取最新信息


仪器网官方订阅号

扫码获取最新信息

在线客服

咨询客服

在线客服
工作日:  9:00-18:00
联系客服 企业专属客服
电话客服:  400-822-6768
工作日:  9:00-18:00
订阅商机

仪采招微信公众号

采购信息一键获取海量商机轻松掌控