如何判断一个指针指向的内存是否释放

faibo 2003-12-12 10:29:57
在delphi里用FreeMem(pointer),或Dispose(pointer)释放内存后
无法判断指针pointer是否被释放,需要手动设置pointer=nil.怎么能不
设置pointer=nil还进行判断.
简单点说:怎么样用
if pointer = <已经被释放,或从来未申请内存> then
FreeMem(pointer);
句式解决这个问题.
...全文
445 26 打赏 收藏 举报
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Spacesoft 2003-12-22
呵呵,faibo (xinliang) 根本没有把原理弄明白~~


这么说吧:系统在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。


  • 打赏
  • 举报
回复
DelphiBird 2003-12-22
你的指针的值其实可以找到的;
也就是指针指向的数据的内存的地址;
然后你freemem之后
然后在copymemory那么大的内存
看看里面的内容,是已经被释放的
  • 打赏
  • 举报
回复
foxnt 2003-12-22
这个问题是没有解的。已经被人问过很多遍了。你不会搜索吗?
所以说,作为一个真正的程序员,内存管理是件很重要的事情。
  • 打赏
  • 举报
回复
DelphiBird 2003-12-22
我的理解是Freemem(pointer)之后,
pointer指针指向的那块内存已经被回收了;
但是pointer指针本身也是将一个地址值保存在内存的另外一个地址上;
这个地址如果在栈上就在过程完毕后自动释放掉了,不需要你做什么pointer=nil只类的;
如果是在堆里,你要将这个指针的值,也就是被你释放的对象原来的地址设置为空;
否则可能你的那块内存可能已经存放了其他的东西并且和你的指针定义的类型完全不一样,而你再用这个指针的时候;可能回引起错误的操作
  • 打赏
  • 举报
回复
VisualLion 2003-12-22
可以引入接口技术
  • 打赏
  • 举报
回复
WuHeHai 2003-12-17
这个问题,我两年前也问过了,最后没有什么结果。
只要我们在释放一个对象的时候,要记住把其指针也同时赋值为nil
  • 打赏
  • 举报
回复
VisualLion 2003-12-17
请见我以前的帖子

http://expert.csdn.net/Expert/topic/1903/1903152.xml?temp=.2238733
  • 打赏
  • 举报
回复
Randy_Mic 2003-12-15
"内存未进行过初始化"?怎么判断?我是说就程序员的逻辑怎么判断?
  • 打赏
  • 举报
回复
manfeng 2003-12-13
这个问题没有一个很好的解决方法,如果同一个内存块只有一个指针指向它那么在释放内存块后马上把改指针设置为nil,以后就可以根据是否空指针判断是否已释放,如果多个指针指向同一个内存块一个指针释放后其它指针指向这个内存块就无效了,但并不为nil,还是无法确定是否已释放
  • 打赏
  • 举报
回复
faibo 2003-12-13
请上面几位人兄弄懂了基本概念和原理,
比较一下在C和C++中的用法在说好吗????????
你们觉得你们说的对吗??


高手都哪里去了..也对,高手也不爱回答这样的问题.
这么简单的一个问题还用说这么多.


这个问题没必要再讨论下去了.
谁看了上面我们所说的,高手会笑掉大牙,
新手..更加糊涂.


  • 打赏
  • 举报
回复
dqzhz 2003-12-13
本來不想多說,本著共同進步的原則:說說上面這行代馬:
===============
if not assigned(pointer) then
FreeMem(pointer);
================

如果要運行 FreeMem(pointer)這一行,必須pointer=nil;
也就是FreeMem(pointer)永遠沒傚

上面有位老兄說他的代碼從來沒出錯,確實沒錯,只是你聲明的所有變量都沒釋放而已。

  • 打赏
  • 举报
回复
aiirii 2003-12-12
在一期 borland的專版上看過討論, 但也沒出個所以然, 最後, 還是用個 try except來解決!
  • 打赏
  • 举报
回复
angelface 2003-12-12
呵呵~~~
  • 打赏
  • 举报
回复
qiume 2003-12-12
呵呵,楼主...
  • 打赏
  • 举报
回复
wolf2005 2003-12-12
if Assigned(pointer) then
FreeAndNil(pointer)
比较保险
  • 打赏
  • 举报
回复
faibo 2003-12-12
我知道用什么了反正也没人答我的问题.
assigned(pointer).
OK!!!!
  • 打赏
  • 举报
回复
faibo 2003-12-12
对不起着急写错了:

if pointer <> [已经被释放,或从来未申请内存] then
FreeMem(pointer);

  • 打赏
  • 举报
回复
fj218 2003-12-12
唯一的办法就是在声明指针和释放指针时将指针置nil。
然后用指针是否等于nil判断。好像没有其他方法了。
我真看不懂faibo(xinliang)在说啥
  • 打赏
  • 举报
回复
faibo 2003-12-12
楼上兄弟, 你的帮助没错,但谁说P is nil.
还有你列出的好像不全这只是其中一种情况而以,
我还不会笨到不看帮助就去询问别人的.
空指针和未分配是两回事,我的代码中P不等于nil."我未进行初始化"!!!!!
请你做过测试用例看看我说的对不对,
我列出来的是测试过的代码.

还有如果P is nil, 我连续Dispose(P)或FreeMem(P) 100次也不会出错,还用判断他做甚???

dqzhz(多情种子) 这位人兄,你说的太对了.
1:如果我写错了,程序应该调不通吧.
2:我写了一年多了都是这么写的。
3:如果真的错了,请您指点一二。
4:这种问题不值得在这里讨论。

不讲了,只是希望大家都多多学习,天天进步,都成为一代编程高手。
说错了请多批评,大家互相探讨。



  • 打赏
  • 举报
回复
Cipherliu 2003-12-12
看看Delphi的help吧

Assigned returns false if P is nil, true otherwise.

Note: Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
语言基础/算法/系统设计
加入

1.6w+

社区成员

Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
申请成为版主
帖子事件
创建了帖子
2003-12-12 10:29
社区公告
暂无公告