如果这是一个显而易见的问题,我很抱歉,但Google或搜索都没有让我得到答案。
有没有办法完全删除数组?
我希望int[] array = new int[5]
答案 0 :(得分:39)
说你打电话:
void Foo(){
int[] a = new int[5];
}
在C#中,无法取消定义变量a
。这意味着即使您将a
设置为null,也会在Foo
中定义a
。
但是,Foo
a
的结尾将超出范围。这意味着没有代码可以引用它,垃圾收集器将在下次运行时为您释放内存,这可能不会持续很长时间。
答案 1 :(得分:17)
你必须让它超出范围,等待GC找到它;这可能不会立即(事实上,它几乎肯定不会)。如果在一个长期存在的对象上有一个字段(它将保留在范围内),那么你可以设置为null,这可以提供帮助。
您可以更快地影响GC收集(不仅仅是您的对象:符合条件的所有内容),但您很少如果这样做。我只在测试台上使用它;但是:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!!
了解GC.Collect
的更多信息:
答案 2 :(得分:5)
没有必要删除数组,GC会处理它。
(非常)简单地说:
当内存不足时,垃圾收集器将启动,停止代码并遍历内存中的所有活动对象。
live表示堆栈上的一些引用,寄存器,静态引用和其他一些统称为“GC Roots”的东西。当它遍历它们时,它注意到它们还活着。
如果你的阵列不再存在,那么任何东西都无法再访问它(这就决定了活力),所以它占用的内存将可以重复使用。
可能是将引用分配给null的理由,如果它将活动保持的时间长于所需的时间,或者它持有你需要的大量内存,但这很容易适得其反实际上让阵列的寿命更长。如果包含实例的寿命比它包含的数组长得多,那么实例而不是堆栈变量是这种优化的更好选择。
要明确的是,作为一个初学者,你不应该考虑这种事情,让GC做它的工作,只有在你做的时候才尝试帮助它:
答案 3 :(得分:5)
你应该阅读Chris Brumme's article on the subject;前几段应说明情况。
任何人建议“将null赋给变量”都应该特别注意那部分:
即使您在使用它之后添加“aC = null;”,JIT也可以自由地将此分配视为死代码并将其消除。
答案 4 :(得分:3)
array = null,但我认为如果您仔细阅读.NET内存管理模型以完全理解原因,那将是一个好主意。
答案 5 :(得分:3)
为了澄清如果您不理解其他答案中表达的某些术语,GC代表垃圾收集器。像C#这样具有自动内存管理功能的语言允许您专注于执行需要完成的任务,而不用担心您正在创建什么以及何时删除它。 GC通过定期遍历您创建的所有对象并查看它们是否对它们有任何引用来工作。如果没有,这意味着你无法用它们做任何事情,所以它们也可能被删除,而系统就是这样做的。
有关详细信息,请参阅http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
答案 6 :(得分:2)
array = null就足够了,不需要GC.Collect。您可以先检查内存,然后再使用Console.WriteLine(GC.GetTotalMemory)引用为null,然后再次进行检查。
答案 7 :(得分:1)
最接近的是等待它超出范围或将其设置为空。
它不会立即删除或删除数组,但在删除对数组的所有引用后,垃圾收集器(GC)将及时删除它...
答案 8 :(得分:0)
您可以在if(true){}语句中声明和初始化数组,在if语句之后(之后)数组变量不可访问,因此它将被删除。
答案 9 :(得分:0)
在C ++中,可以使用 delete 关键字。它最初在本评论和其他评论中提到过。编辑历史显示了这一点。即使其他人不理解为什么,这也是可行的(尽管是侧面答案)。我这样说是因为如果他们理解多种语言,就可以用它来找到自己优雅的解决方案。
在.NET / MSIL中,您有delete关键字,但它被称为 variablename .Dispose()。我提供这个是因为它删除了对变量的所有引用,并将其推送到垃圾收集的准备状态。另一种选择是将变量设置为等于 null ,因为它将变量保存为类型化对象,但是将其保存到垃圾收集中,以便稍后可以重新分配。
原始评论/答案:
C#的垃圾收集很棒,但是有时候你真的需要从内存中删除一个变量并创建一个新的实例,而程序的其他部分不会让它保持活动状态。通过将数组指向新的内存,可以将数组所拥有的现有内存块放入GC状态,例如:
aMyArray = new int[];
然而,我可以用这种方式看到的主要问题是你真的不想浪费大量内存,然后因为操作系统开始因为操作系统启动而导致一切都停止了。考虑到C Sharp现在是一种主流语言并且用于很多不同的应用程序,包括编写游戏,我认为这是一个想法......如果C Sharp在这方面的行为与ActionScript / FLASH类似,那真是太好了。尊重。
答案 10 :(得分:-4)
这可能已经解决但您可以将数组视为堆栈。循环遍历它并在每次迭代时弹出顶部。
while(true)
{
if(array.Length==0)
{
break;
}
array.Pop();
}
通过这种方式,您可以将更多值推送到数组中而无需重新实例化