问一个入门级问题:“new”用关闭吗?
比如:var image=new Image();
不关闭new会不会造成内存泄露?关闭语句是什么?
------解决方案--------------------image = null;
------解决方案--------------------new 是实例化一个变量,不用关闭,也没有关闭的方法。
------解决方案--------------------楼上说的都对~~
补充一下:
js里的内存泄露不是new造成的,而是由循环引用,闭包等造成的。
1楼的方法是一种避免内存泄露的方法。
http://developer.51cto.com/art/201007/212040_all.htm
------解决方案--------------------这得看构造函数里面使用的资源及使用方式,比如dom操作,flash使用,图形渲染都是可能有内存泄露的,如果其中有造成泄露的部分,你可以给类写一个显示释放资源的方法
js给予了最大的灵活性,同时意味着很多东西都是需要自己实现的,比如继承,也如这儿的类资源释放方法
------解决方案--------------------
是否能自动释放要看使用方式,循环引用,不恰当使用闭包会造成变量无法释放
没代码你这样问谁知道会不会泄露?
如果是关闭页面的话,页面所有资源都会被释放
------解决方案--------------------
不知道,这是浏览器的对js及dom的支持实现了,和js语言自身没关系了
------解决方案--------------------我是楼主,谢谢各位!
我的语句到底有没有泄露呢?“new Image()”是不是也像C++一样,在堆区开辟了一块内存?
进一步说,关闭页面后,我这种语句(包括上面说的循环引用、闭包等)占用的内存会自动全部释放吗?
开辟了啊,这个是必然的。
C++需要程序员手动管理内存,new了东西就要记得自己delete,有构造器,还有对应的析构器。
就像java一样,js有自动垃圾回收机制,浏览器或者说js解析引擎会使用算法来判断对象是否符合回收条件,从而帮助程序员自动管理对象。最直接的方法是判断对象的引用个数,当然实际肯定没这么简单。
JS没有析构函数,也不存在把某个对象手动析构的说法,img=null是将该对象的引用置空,让这块内存无引用指向,等待自动GC。某些场合可能会造成对象无法被GC,就是js中所谓的内存泄露,良好的代码应该尽量避免这些问题。
------解决方案--------------------不是避免极端情况,是我可以确定img再以后的代码中用不着了。
------解决方案--------------------还有,img=null是将该对象的引用置空?那可以用free或delete释放吗?
到底该怎样做呢?
现在虚拟机都是 gc机制 一个对象没有被引用(引用链也没有被引用) 则会被释放
从某种意义上说
function k(){
var a = new ...;
}
k函数执行完 普通情况下 a指向的对象的引用就为0了 因为 变量a 已经出栈被释放了
这个时候 你不需要 手动设置 null
所以说 基本你不需要考虑 释放这个情况
理论上 一个全局变量你不需要使用了 那么就 设置null吧
一个局部变量 不需要设置null 因为出