即使它有引用(c#或Java),我如何删除对象?
例如:
void Main()
{
var f = new Foo();
var person = f.GetPerson();
}
public class Foo
{
private object _person;
public Foo()
{
_person = new object();
}
public object GetPerson()
{
return _person;
}
}
我想从内存中删除_person我该怎么办?
答案 0 :(得分:11)
你不能,简单地说。
如果您确实希望实现类似功能,可以通过代理引用Person
,然后传递代理。因此,您可以将基础Person引用设置为null(只是指示该对象可用于删除 - 不强制删除它),但客户端仍将包含代理引用。
您可能希望查看相关的Java SoftReferences and WeakReferences,并且可以在垃圾回收周期中删除对象,尽管其他地方可以使用弱/软引用。
答案 1 :(得分:1)
基本上,您希望使生活参考无效。这将打破使用自动内存管理的语言的关键假设,这是无法解决无效指针的问题。至少在Java中,这肯定是不可能的,我邀请C#专家使用C#特定信息为这个社区维基做贡献。
为了解决您的要求:您必须将对象的引用封装在另一个对象中,并且永远不要让引用转义,以确保该引用的100%所有权。所以外部对象需要复制内部对象的完整API,基本上是 Decorator 模式。
如果您这样做,您可以随时选择将内部引用设置为null
,从而可靠地释放对象。
答案 2 :(得分:0)
您无法通过托管语言引用从内存中删除对象。
您可以通过将引用设置为Null并调用GC.Collect()
将其从C#中的内存中删除