Delphi FreeMem 内存释放

释放了结构指针dispose,释放了内存FreeMem,为什么内存中还是有数据?如果用ZeroMemory代替FreeMem的话就成功对Delphi了解的不是很深,希望高... 释放了结构指针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;
展开
 我来答
RedBaronVIP
2013-03-27 · TA获得超过1147个赞
知道小有建树答主
回答量:655
采纳率:0%
帮助的人:241万
展开全部
1、之所以不出错,是因为操作系统目前还没有使用这块内存,释放和重新利用是两个概念。
2、ZeroMemory与FreeMem根本就是两个不同功能的函数,一个清空内存(填充0),一个释放内存(把资源还给操作系统),代替个球?
3、CopyMemory仅仅是复制了9个字符,字符串必须以0结尾,你也没有置零。把 GetMem(A^.pac, 100)改成A^.pac := AllocMem(100)才对。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
FanyongYin
推荐于2018-05-10 · TA获得超过1054个赞
知道小有建树答主
回答量:1298
采纳率:100%
帮助的人:1009万
展开全部
free掉了没说不能再次使用,但是如果这样子直接使用的话会出现意外的,因为你是在没有重新申请的情况下直接使用的,而实际上这块内存的管理已经不在App了

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

所以在free掉之后,你需要给这个指针赋值为nil的;这个时候有人直接再去使用,那就是空指针了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
开心小书生
2013-03-26 · TA获得超过406个赞
知道小有建树答主
回答量:321
采纳率:50%
帮助的人:300万
展开全部
申请,指针指过去,记录引用
释放,减除引用,指针还在那里
没有记录可能就会被另一次申请去了,
并改了值,再访问,不是想要的结果
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式