在delphi里用FreeMem(pointer),或Dispose(pointer)释放内存后
无法判断指针pointer是否被释放,需要手动设置pointer=nil.怎么能不
设置pointer=nil还进行判断.
简单点说:怎么样用
if pointer = <已经被释放,或从来未申请内存> then
FreeMem(pointer);
句式解决这个问题.
无法判断指针pointer是否被释放,需要手动设置pointer=nil.怎么能不
设置pointer=nil还进行判断.
简单点说:怎么样用
if pointer = <已经被释放,或从来未申请内存> then
FreeMem(pointer);
句式解决这个问题.
FreeMem(pointer);
assigned(pointer).
OK!!!!
FreeAndNil(pointer)
比较保险
和 a=nil是完全相同的
FreeAndNil(pointer)
一点都不保险
如
var
p : pointer ;
begin
p := pointer(2);
// 此時P為無效指針, 誰能判斷?
caption := inttostr(Pinteger(P)^);
end;
判断时应该这样写,上面我写的简单了. if not assigned(pointer) then
FreeMem(pointer);
不能用 a= nil 原因:
如下:
1>:一定出异常
var
pointer:TPointer;
begin
if pointer <> nil then
FreeMem(pointer);
end;用assigned不会出错:
var
pointer:TPointer;
begin
if not assigned(pointer) then
FreeMem(pointer);
end;这回你们再试,一定保险,不保险你再来找我吧.我也是才试出来的.
p : pointer ;
begin
p := pointer(2);
// 此時P為無效指針, 誰能判斷?
if not assigned(p) then
caption := inttostr(Pinteger(P)^);
end;
还有你列出的好像不全这只是其中一种情况而以,
我还不会笨到不看帮助就去询问别人的.
空指针和未分配是两回事,我的代码中P不等于nil."我未进行初始化"!!!!!
请你做过测试用例看看我说的对不对,
我列出来的是测试过的代码.还有如果P is nil, 我连续Dispose(P)或FreeMem(P) 100次也不会出错,还用判断他做甚???dqzhz(多情种子) 这位人兄,你说的太对了.
1:如果我写错了,程序应该调不通吧.
2:我写了一年多了都是这么写的。
3:如果真的错了,请您指点一二。
4:这种问题不值得在这里讨论。不讲了,只是希望大家都多多学习,天天进步,都成为一代编程高手。
说错了请多批评,大家互相探讨。
然后用指针是否等于nil判断。好像没有其他方法了。
我真看不懂faibo(xinliang)在说啥
===============
if not assigned(pointer) then
FreeMem(pointer);
================ 如果要運行 FreeMem(pointer)這一行,必須pointer=nil;
也就是FreeMem(pointer)永遠沒傚上面有位老兄說他的代碼從來沒出錯,確實沒錯,只是你聲明的所有變量都沒釋放而已。
只要我们在释放一个对象的时候,要记住把其指针也同时赋值为nil
pointer指针指向的那块内存已经被回收了;
但是pointer指针本身也是将一个地址值保存在内存的另外一个地址上;
这个地址如果在栈上就在过程完毕后自动释放掉了,不需要你做什么pointer=nil只类的;
如果是在堆里,你要将这个指针的值,也就是被你释放的对象原来的地址设置为空;
否则可能你的那块内存可能已经存放了其他的东西并且和你的指针定义的类型完全不一样,而你再用这个指针的时候;可能回引起错误的操作
也就是指针指向的数据的内存的地址;
然后你freemem之后
然后在copymemory那么大的内存
看看里面的内容,是已经被释放的
这么说吧:系统在GetMem 的时候做的是什么呢?首先是系统在堆里开辟一段内存,然后把这段内存的首地址放到指针里面。指针其实就是一个32位的内存单元。
那么,FreeMem 呢?它就直接把指针所指向的那段内存释放掉了。注意:这个过程并不承诺帮你把指针清零,也就是说它确实还指向一个地址,那个地址是存在的,尽管那个空间已经被释放掉了。所以Assigned(p)事实上返回的还是True。楼主理解Assigned 是分配的意思,其实是不对的。Assigned 是指派的意思,就是说指针是不是确实指向了一个地址。所以Assigned(p)其实和(p=nil) 是一个意思。所以,请注意:假如你希望Assigned(p) 有效的话,必须保证p 在不指向一个有效地址的时候一定被赋为nil。比如FreeMem(p); 之后一定要跟一个p := nil;
顺便说一下,在函数的结尾假如FreeMem(p);之后马上跟一个p := nil;,常常会导致一个编译器警告,说是对变量赋值但是没有使用,所以后来的Delphi 里面就提供了一个FreeAndNil()的procedure,以便避免这样的警告。所以,推荐大家使用在释放内存的时候使用这个procedure。