Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,我是否应该删除上一级';加载一个新实例后,是否为s实例?_Javascript_Oop_Memory_Memory Management_Memory Leaks - Fatal编程技术网

在Javascript中,我是否应该删除上一级';加载一个新实例后,是否为s实例?

在Javascript中,我是否应该删除上一级';加载一个新实例后,是否为s实例?,javascript,oop,memory,memory-management,memory-leaks,Javascript,Oop,Memory,Memory Management,Memory Leaks,我制作了一个HTML5游戏,由许多小关卡组成。当玩家到达门时,另一关卡被载入。当一个级别加载时,它基本上只是将所有实例数组设置为[],然后通过创建新的对象实例将对象推入其中,例如: enemies = [] //this has previously been full of pointers from the old level for (i = 0; i < n_enemies; i ++) enemies.push(new Enemy()); feeds=[]//以前这里充

我制作了一个HTML5游戏,由许多小关卡组成。当玩家到达门时,另一关卡被载入。当一个级别加载时,它基本上只是将所有实例数组设置为
[]
,然后通过创建新的对象实例将对象推入其中,例如:

enemies = [] //this has previously been full of pointers from the old level
for (i = 0; i < n_enemies; i ++)
    enemies.push(new Enemy());
feeds=[]//以前这里充满了旧级别的指针
对于(i=0;i

但是,我注意到,仅仅设置一个满是指向
[]
的指针的数组,实际上并不能删除实例!那么,javascript会自动完成这项工作吗?或者我必须自己
删除每个实例吗?

如果数组中的对象不再从任何地方引用,那么它们将被垃圾收集。没有说明何时会发生这种情况的规范,但应该是在将它们从阵列中删除后不久


这应该不会出现内存泄漏。

它与任何其他编程语言一样。如果存在对对象的引用,则不会将其删除

e、 g

若你们在清空敌人后并没有创建一个对象的引用,敌人的对象也会被删除

enemies.push(new Enemy());

我对开发游戏不太了解,但通常在Javascript中,清除数组就是这样做的,这是一个很好的实践

enemies.length = 0;

选中此项,JavaScript中没有
free
命令,因此您自己实际上无法“释放”任何内存。您所能做的就是:删除指向某个对象的所有引用(指针)。最终,垃圾收集器将查找对任何人都不再可见的对象

或者更确切地说:GC最终将收集所有仍然可以访问的内存,并忘记其余的内存。这就是为什么在GC环境中只有活动对象需要花费的原因


但有一个陷阱:GC不会告诉对象它们已经死了。因此,如果您的敌人对象需要一些清理,那么您必须手动进行。

*任何其他垃圾收集编程语言。如果您使用的是非GC语言,则需要自己处理内存分配。我以前从未听说过这一点。它看起来很有效(只是在Chrome中测试过),但有没有提到这是一个好的实践?好的,但我认为这应该是一个评论,因为它没有直接回答这个问题。谢谢我在Chrome上也测试过它,它可以工作,但我没有在任何地方读到它。如果这是“正确”的方式,为什么没有更多的人谈论它呢?
[]
这不会清空数组,而是会创建一个新的空数组array@Jivings-存在巨大差异
a=[]
创建一个新数组并将其分配给
a
,保留原始数组不变,
a.length=0
将数组的长度设置为零(有效地删除其所有数字属性)。@Jivings更清楚地了解RobG的点<代码>变量a=[1,2,3]变量b=a如果使用
a=[]b
仍然是
[1,2,3]
。如果使用
a.length=0
然后
a
b
都被清除(因为它们仍然指向同一个数组,而如果使用
a=[];
现在将有两个数组
[]
[1,2,3]
),没有吗?我很确定有,这是一个关键词,我在某个地方读到过+1获取所有有用信息。@Bane
delete
操作符从对象中删除属性;它不会释放内存。可以将其视为数组的对应项。pop()
还可以将
delete
仅定义为对象的属性,因此javascript甚至不包含删除数组变量的方法——您只需假设js引擎将在删除所有引用后处理垃圾收集。其中,srhys-array成员只是具有数字名称的属性。Delete也适用于它们(例如,
Delete array['0']
删除从零开始的数组的第一个成员),但正如Jivings所说,这里没有必要使用它。@RobG-我可能应该更清楚一些-我说的“数组变量”是指数组中的变量,而不是数组中存储的原始值。
enemies.length = 0;