delphi free 判断
一个对象free后为什么还能访问??怎么判断一个对象已经FREE??assigned判断不了Free我环境winxp+d7...
一个对象free后为什么还能访问??
怎么判断一个对象已经FREE??
assigned 判断不了Free
我环境 winxp + d7 展开
怎么判断一个对象已经FREE??
assigned 判断不了Free
我环境 winxp + d7 展开
1个回答
展开全部
第一个问题:
打个比方,比如删除电脑上的文件,文件本身所在的磁盘空间并不是被真的删除,只是删除了一个标记,告诉操作系统可以用这块磁盘了,如果这块区域没被重新写入,那文件是可以被恢复的
同理
引用的对象被free了后,对象本身所在的内存区域的标记被删除,但所指向的内存区域的值还是没变的,同时该引用指向的内存地址仍然是之前对象本身所在的区域,所以仍能读出数值来,但此时引用本身已经属于野指针了,如果该内存区块被其他地方申请使用,那么指针访问的值就是错误的,或者直接报指针错误。
第二个问题:
仅仅free了,后面是没法有效判断对象已经free了。正确的做法是free后,再设置指针或者引用为nil。后面再通过判断指针是否为nil来判断对象是否被free
如 a.free;
a := nil;
打个比方,比如删除电脑上的文件,文件本身所在的磁盘空间并不是被真的删除,只是删除了一个标记,告诉操作系统可以用这块磁盘了,如果这块区域没被重新写入,那文件是可以被恢复的
同理
引用的对象被free了后,对象本身所在的内存区域的标记被删除,但所指向的内存区域的值还是没变的,同时该引用指向的内存地址仍然是之前对象本身所在的区域,所以仍能读出数值来,但此时引用本身已经属于野指针了,如果该内存区块被其他地方申请使用,那么指针访问的值就是错误的,或者直接报指针错误。
第二个问题:
仅仅free了,后面是没法有效判断对象已经free了。正确的做法是free后,再设置指针或者引用为nil。后面再通过判断指针是否为nil来判断对象是否被free
如 a.free;
a := nil;
追问
线程类tthread当执行结束后自动free,怎么给它赋值nil
追答
线程自动free,在某个地方肯定有这个thread 的引用吧,你在线程方法的最下面,添加把这个引用置为nil代码即可。虽然此时这个对象还没有被释放,但剩下的你不用管了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询