QT中 自己new的QSound对象如何销毁

QT中 自己new的QSound对象如何销毁,第1张

自己delete是可以的
不过qt对于内存管理是很方便的。他可以在父对象删除时自动删除子对象,而不需要你去关心内存的释放。
所以你只要设置了父子关系就可以不用管什么时候销毁了。
把this指针传给他
QSound snd=new QSound(this);

应该是obj=null;对象还存在是因为null也是一个对象,用typeof检测null,返回object,给对象赋null,他已经为空了,如果你觉得按此方法obj还存在的话,你可以检测obj的方法和属性,应该不在的;
<script type="text/javascript">
var x=new Object();
xa="ddd";
windowonload=function(){
//x=null; 去掉注释再试试
alert(xa);
}
</script>

var obj ;//这个是包含了方法的对象
for(var a in obj){
    if(typeof a == "function" && objhasOwnProperty(a)){
        a = null;
    }
}

在Java虚拟机中,堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是确定这些对象之中那些还“存活”着,哪些已经“死去”(死去就是不可能再被任何途径使用的对象)了。

那么对象销毁过程。也就是finalization机制。

这是对象销毁前的一个回调方法:finalize()

它是Object类中的一个方法,在对象被最终回收之前调用一次(只调用一次)。

Java语言是提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。

就是Java是允许对象在销毁之前去调用finalize()方法,去调用一些逻辑。(但是一般建议是不使用的)

当垃圾回收器发现没有引用一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法,但是一个对象的finalize()方法只被调用一次。

finalize() 方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源的释放和清理工作。

比如:关闭文件、套接字和数据库连接等。

在父类Object类中的finalize()源码:

就是空的,具体实现什么,就是要在子类重写,写入需要的 *** 作。

但是在实际 *** 作中,永远都不要显示调用某个对象的finalize()方法,应该交给垃圾回收机制调用。 在里面写代码一定要慎重

主要有以下原因:

这样做的原因是,如果某个对象的finalize()方法执行缓慢,或者更极端的死循环,将会导致F-Queue队列中的其他对象永久处于等待,甚至导致整个内存回收子系统的奔溃。(F-Queue队列具体是什么,看下面)

上面提到自己写的finalize()方法会造成对象的复活,那么在这就主要讨论一些对象的生存还是死亡。

这里所说的对象问题都是在垃圾标记阶段算法 可达性在算法中表现。

因为在堆当中产生一个垃圾就回收一个垃圾的这种做法,显然是不合理的,所以在内存当中,是产生一个垃圾,先进行标记,当内存满的时候,再将标记的对象进行回收 *** 作。

所以在标记阶段,在虚拟机中因为finalize()方法的存在,虚拟机中的对象又分为三种可能的状态

在以上3种状态中,是由于finalize()方法的存在,进行的区分,只有在对象到达不可触及时才可以被回收。

即使在垃圾标记阶段算法中可达性算法中的被判定为不可达的对象,但也不是要“非死不可”的,在这个时候它们暂时还处于“缓刑”阶段,要真正的宣告一个对象死亡,最多是要经历两次标记过程的:

(在这个之间就会出现一个问题,这个方法的执行时间,完全是由线程决定的,恰好在开始执行finalize()的时候,在执行“复活”的时候线程结束了,那也就复活失败了)

代码演示:

从代码中运行结果可以明显地看出,demo的对象finalize()方法确实是可以被垃圾收集器触发的,并且在被收集前成功可以逃脱的。

在这个代码中也完整地体现出来,虽然运行了同样的代码,但是执行结果是一次成功一次失败,这也说明出来finalize方法是只能被调用一次的,如果再在下一次回收的时候,它的finalize方法是不会在被调用的。

最后再次说明一下,虽然Java拥有这样的机制,但是是完全不建议使用的,它的运行代价高,不确定性大,无法保证各个对象的调用顺序,在官方说明中都明确说明了不建议使用的。最开始做这个完全是为了使传统的C、C++程序员更容易接受Java所做的一种妥协。

而我们要做“关闭外部资源”之类的清理工作的时候,完全是可以采用try-finally等方式来使用的。

我是一个做Java开发的不太正经的程序员,最近金三银四跳槽的人很多,给大伙发点福利吧,之前自己和朋友整理的一些Java成长知识点和面经、面试题。如果有最近打算跳槽,或者想成长的技术人都可以看一看,应该会有比较大的帮助。

文中不能发链接,私信我发送“ 666 ”免费领取。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13376048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存