这些变量是垃圾吗?
我今天正在练习编码,并且今天解决了“从链表中删除某个值的所有元素”的问题。 我提出的解决方案是
public void RemoveAll ( T val )
{
if(_root == null)
return;
if(_root.Value == val)
{
_root = _root.Next;
RemoveAll(val);
}
Node last = _root,
cur = _root.Next;
while(cur != null)
{
if(cur.Value == val)
last.Next = cur.Next;
else
last = cur;
cur = cur.Next;
}
}
这是我的问题:
当cur.Value == val
我正在做一些类似于更改列表的操作
A -> B -> C
至
A -> C
编译器或运行时环境是否会看到B
不再被使用并处理掉? 或者我应该明确这么做吗?
我还有第二个问题,就是调用堆栈是否为递归void
方法而爆发。 正如你在这里看到的那样,这个方法有可能调用它自己。 但是由于这是一种不返回值的方法,运行时环境不能擦除上次调用的数据吗? 没有理由留在记忆中(对吗?)。
编译器或运行时环境是否会看到B不再被使用并处理掉? 或者我应该明确这么做吗?
GC在运行时会意识到没有对该对象的主动引用并将其清除(假设没有其他人持有对该对象的引用)。 您无法手动清理.NET中的单个对象。 在.NET中,内存由垃圾收集器根据需要进行管理和清理。
我还有第二个问题,就是调用堆栈是否为递归void方法而爆发。 正如你在这里看到的那样,这个方法有可能调用它自己。 但是由于这是一种不返回值的方法,运行时环境不能擦除上次调用的数据吗? 没有理由留在记忆中(对吗?)。
你正在描述尾递归。 C#编译器不会生成尾递归调用。 Becaus eof说,如果你的递归太深,你可能会遇到StackOverflowException
。
该限制不是CLR限制 - .NET Framework确实支持尾部调用。 它是不会发出尾部IL操作码的C#编译器。 在手动生成IL或使用F#时,您可以在.NET Framework中使用尾递归工作,这会在适当的时候生成尾调用。
有关更多详细信息,请参阅https://stackoverflow.com/a/15865150/1163867。
PS。 我认为你的代码有一个错误。 看起来您应该在递归调用RemoveAll
后尽早返回:
if(_root.Value == val)
{
_root = _root.Next;
RemoveAll(val);
return;
}
链接地址: http://www.djcxy.com/p/80625.html