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; 展开
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; 展开
展开全部
1、之所以不出错,是因为操作系统目前还没有使用这块内存,释放和重新利用是两个概念。
2、ZeroMemory与FreeMem根本就是两个不同功能的函数,一个清空内存(填充0),一个释放内存(把资源还给操作系统),代替个球?
3、CopyMemory仅仅是复制了9个字符,字符串必须以0结尾,你也没有置零。把 GetMem(A^.pac, 100)改成A^.pac := AllocMem(100)才对。
2、ZeroMemory与FreeMem根本就是两个不同功能的函数,一个清空内存(填充0),一个释放内存(把资源还给操作系统),代替个球?
3、CopyMemory仅仅是复制了9个字符,字符串必须以0结尾,你也没有置零。把 GetMem(A^.pac, 100)改成A^.pac := AllocMem(100)才对。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
free掉了没说不能再次使用,但是如果这样子直接使用的话会出现意外的,因为你是在没有重新申请的情况下直接使用的,而实际上这块内存的管理已经不在App了
如果这个时候其他App或者其他进程/线程之类的能成功申请到这块Memory,那么大家就要conflict了
所以在free掉之后,你需要给这个指针赋值为nil的;这个时候有人直接再去使用,那就是空指针了
如果这个时候其他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;
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
申请,指针指过去,记录引用
释放,减除引用,指针还在那里
没有记录可能就会被另一次申请去了,
并改了值,再访问,不是想要的结果
释放,减除引用,指针还在那里
没有记录可能就会被另一次申请去了,
并改了值,再访问,不是想要的结果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询