C# C中的强制删除/处理# 我从来没有真正想到过,因为我从C++移植到C时从来没有想过它,但是…有没有一种方法可以强制释放内存,比如列表、数组,甚至是没有实现IDisposable的对象?让我解释一下我的想法 在C++中,如果我想创建一个动态数组,我会写这样的东西: int* arr = NULL; arr = new int[10];

C# C中的强制删除/处理# 我从来没有真正想到过,因为我从C++移植到C时从来没有想过它,但是…有没有一种方法可以强制释放内存,比如列表、数组,甚至是没有实现IDisposable的对象?让我解释一下我的想法 在C++中,如果我想创建一个动态数组,我会写这样的东西: int* arr = NULL; arr = new int[10];,c#,dispose,delete-operator,C#,Dispose,Delete Operator,…但是,我必须在完成后将其删除,否则将出现内存泄漏: delete [] arr; 嗯,在C#中似乎没有类似的东西,或者说有吗?我一直找不到。似乎只有实现IDisposable接口的对象才能被强制处置。那么,你是说。。。数组设置为null,在这种情况下,让GC清理内存是唯一的方法吗 我已经阅读了GC.Collect(),不赞成强制进行早期收集,所以我想知道这些类型是否有什么独特之处?我意识到C不是C++,我只是想知道我是否缺少明显的东西。 < P>类的代码> IDISPABIONE 接口实现方

…但是,我必须在完成后将其删除,否则将出现内存泄漏:

delete [] arr;
嗯,在C#中似乎没有类似的东西,或者说有吗?我一直找不到。似乎只有实现
IDisposable
接口的对象才能被强制处置。那么,你是说。。。数组设置为
null
,在这种情况下,让GC清理内存是唯一的方法吗


我已经阅读了
GC.Collect()
,不赞成强制进行早期收集,所以我想知道这些类型是否有什么独特之处?我意识到C不是C++,我只是想知道我是否缺少明显的东西。

< P>类的代码> IDISPABIONE 接口实现方法:代码>处置< /C> >,这是强制对象被处理的一个。< /P> 但是C#中有一个垃圾收集器,它会自动删除所有未被引用的对象。这意味着当您离开其上下文时,所有局部变量都会自动删除,等等

所以在很多情况下,调用
Dispose
是不必要的

一般来说,如果要在对象使用后释放其内存,建议使用
using
语句:

using (... some object creation ...) 
{
    ... using object ...
}
// here, the object is disposed

IDisposable
接口的类实现了方法
Dispose
,该方法用于强制处理对象

但是C#中有一个垃圾收集器,它会自动删除所有未被引用的对象。这意味着当您离开其上下文时,所有局部变量都会自动删除,等等

所以在很多情况下,调用
Dispose
是不必要的

一般来说,如果要在对象使用后释放其内存,建议使用
using
语句:

using (... some object creation ...) 
{
    ... using object ...
}
// here, the object is disposed

IDisposable
接口的类实现了方法
Dispose
,该方法用于强制处理对象

但是C#中有一个垃圾收集器,它会自动删除所有未被引用的对象。这意味着当您离开其上下文时,所有局部变量都会自动删除,等等

所以在很多情况下,调用
Dispose
是不必要的

一般来说,如果要在对象使用后释放其内存,建议使用
using
语句:

using (... some object creation ...) 
{
    ... using object ...
}
// here, the object is disposed

IDisposable
接口的类实现了方法
Dispose
,该方法用于强制处理对象

但是C#中有一个垃圾收集器,它会自动删除所有未被引用的对象。这意味着当您离开其上下文时,所有局部变量都会自动删除,等等

所以在很多情况下,调用
Dispose
是不必要的

一般来说,如果要在对象使用后释放其内存,建议使用
using
语句:

using (... some object creation ...) 
{
    ... using object ...
}
// here, the object is disposed
我说。。。数组设置为
null
,在这种情况下,让GC清理内存是唯一的方法

嗯,第一位可能是错误的,除非
arr
实际上是(比如)另一个对象的场,它将继续存在很长一段时间。在您的示例中,
arr
是一个局部变量,而GC和JIT(当您运行发布代码而不是调试时)合谋非常准确地知道此类变量的生存期。他们知道,
arr
不再被使用,因此有资格进行垃圾收集-无需为其分配
null

现在,更广泛的问题是——不,没有办法急切地将记忆归还。实际上,如果允许您告诉GC“请立即收回这段内存”1,将需要更多的工作
GC.Collect
,正如你所说,是不受欢迎的,因为即使这样也不是真正的“请收回我不再使用的内存块”,而是“请运行完整的分析以确定不再需要的所有内存块,然后执行压缩,等等”

1托管内存系统有一种简单的方法来跟踪新分配的可用内存—它位于所有以前分配的块的末尾。因此,压缩是释放的内存可以重用的唯一方法

我说。。。数组设置为
null
,在这种情况下,让GC清理内存是唯一的方法

嗯,第一位可能是错误的,除非
arr
实际上是(比如)另一个对象的场,它将继续存在很长一段时间。在您的示例中,
arr
是一个局部变量,而GC和JIT(当您运行发布代码而不是调试时)合谋非常准确地知道此类变量的生存期。他们知道,
arr
不再被使用,因此有资格进行垃圾收集-无需为其分配
null

现在,更广泛的问题是——不,没有办法急切地将记忆归还。实际上,如果允许您告诉GC“请立即收回这段内存”1,将需要更多的工作
GC.Collect
,正如你所说,是不受欢迎的,因为即使这样也不是真正的“请收回我不再使用的内存块”,而是“请运行完整的分析以确定不再需要的所有内存块,然后执行压缩,等等”

1托管内存系统有一种简单的方法来跟踪新分配的可用内存—它位于所有以前分配的块的末尾。因此,压缩是释放的内存可以重用的唯一方法。