在forusely上释放未使用对象的内存

时间:2016-04-17 10:02:18

标签: c# data-structures garbage-collection

让我们考虑单链接列表中的以下场景: -

我已经获得了目标节点,该节点将被删除。

让我们假设以下数据,我将收到持有" 3"的对象,这是我要删除的对象;

1 - > 2 - > 3 - > 4 - > 5 - > 6

班级结构是: -

Class DataHolder
{
int data;
DataHolder nxtPrt;
}

Void Delete (DataHolder currentData)
{

currentData.data = currentData.nxtPrt.data; //Now 3 will be overwritten by 4
(x) currentData.nxtPrt = (y) currentData.nxtPrt.nxtPrt;  

//Now the object which belongs to 4 (previously it was 3), 
//is pointing to 5;

}

所以,现在对象4的实际副本现在变得无用了;

所以,现在我只想删除分配给4的原始副本的空间;

但是,现在我无法跟踪它,因为我已将对象更改为第5点。

所以现在,我已经失去了实际的对象4.

我可以知道,有没有办法强行要求对象释放其占用的内存,就像在" C"使用dealloc, 或者我必须依靠GC来收集未使用的空间。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您始终依赖GC,没有办法解决问题。是的,它会清理你的其他物体,只要它们没有引用它们。您可以根据需要分配非托管内存并处理它,但在这种情况下,您为什么要使用C#?只需使用C(++)。

但最简单的答案是不要编写自己的链接列表。只需使用LinkedList<YourStruct>即可。了解您的环境 - 语言,库和运行时。如果您只是想用C#编写C代码,那么您将会受到伤害,没有人会理解您的代码您几乎无法从中获益C#。再说一遍,如果你不想使用C#/ .NET ......不要。 C或C ++或非托管语言本质上没有任何错误。使用最好的工具。

根本不用C语言思考。它根本不适用于GC /托管环境。在C中分配内存时,内存来自哪里?通常是堆栈或堆,寄存器中有几位。在.NET中,这是抽象的,但在实践中,你仍然只有这三个位置。但是,它们的工作方式不同您无法在堆栈上分配类或数组(使用不安全代码的支持有限,但就是这样)。有多个堆,除了大对象堆外,它们始终从顶部分配,类似于堆栈。因此,取消分配单个对象没有任何价值 - 如果你没有压缩堆来消除免费点,那么你就不会减少内存使用量,而且你也不会。为新对象获取任何额外空间。