强制取消分配未使用对象上的内存

本文关键字:内存 对象 未使用 取消 分配 | 更新日期: 2024-09-26 02:10:13

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

我已经得到了目标节点,它将被删除。

让我们假设以下数据,我将接收包含"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根据其意愿收集未使用的空间。

提前谢谢。

强制取消分配未使用对象上的内存

你总是依赖GC,没有办法绕过它。是的,它会清理你的其他对象,只要没有引用它们。您可以分配非托管内存,并根据自己的意愿进行处理,但在这种情况下,为什么要使用C#?只需使用C(++)。

但最简单的答案是不要写自己的链接列表。只需使用LinkedList<YourStruct>。学习您的环境——语言、库和运行时。如果你只是想用C#编写C代码,你会受到伤害,没有人会理解你的代码你在C#中工作几乎没有任何好处。同样,如果你不想使用C#/.NET……不要。C或C++,或者非托管语言本身并没有什么问题。使用适合工作的最佳工具。

根本不要用C术语思考。它在GC管理的环境中根本不起作用。在C中分配内存时,内存从何而来?通常是堆栈或堆,寄存器中有几个位。在.NET中,这是一种抽象,但在实践中,您仍然只有这三个位置。然而,它们的工作方式不同。不能在堆栈上分配类或数组(使用不安全代码的支持有限,但仅此而已)。有多个堆,除了大对象堆之外,它们总是从顶部分配,类似于堆栈。因此,释放单个对象没有任何价值——如果你不压缩堆以消除空闲点,你就不会减少内存使用,也不会为新对象获得任何额外的空间。