让我们考虑单链接列表中的以下场景: -
我已经获得了目标节点,该节点将被删除。
让我们假设以下数据,我将收到持有" 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来收集未使用的空间。
提前致谢。
答案 0 :(得分:2)
您始终依赖GC,没有办法解决问题。是的,它会清理你的其他物体,只要它们没有引用它们。您可以根据需要分配非托管内存并处理它,但在这种情况下,您为什么要使用C#?只需使用C(++)。
但最简单的答案是不要编写自己的链接列表。只需使用LinkedList<YourStruct>
即可。了解您的环境 - 语言,库和运行时。如果您只是想用C#编写C代码,那么您将会受到伤害,没有人会理解您的代码和您几乎无法从中获益C#。再说一遍,如果你不想使用C#/ .NET ......不要。 C或C ++或非托管语言本质上没有任何错误。使用最好的工具。
根本不用C语言思考。它根本不适用于GC /托管环境。在C中分配内存时,内存来自哪里?通常是堆栈或堆,寄存器中有几位。在.NET中,这是抽象的,但在实践中,你仍然只有这三个位置。但是,它们的工作方式不同您无法在堆栈上分配类或数组(使用不安全代码的支持有限,但就是这样)。有多个堆,除了大对象堆外,它们始终从顶部分配,类似于堆栈。因此,取消分配单个对象没有任何价值 - 如果你没有压缩堆来消除免费点,那么你就不会减少内存使用量,而且你也不会。为新对象获取任何额外空间。