强制从内存中删除对象

时间:2013-05-17 10:59:43

标签: c# java garbage-collection

即使它有引用(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我该怎么办?

3 个答案:

答案 0 :(得分:11)

你不能,简单地说。

如果您确实希望实现类似功能,可以通过代理引用Person,然后传递代理。因此,您可以将基础Person引用设置为null(只是指示该对象可用于删除 - 强制删除它),但客户端仍将包含代理引用。

您可能希望查看相关的Java SoftReferences and WeakReferences,并且可以在垃圾回收周期中删除对象,尽管其他地方可以使用弱/软引用。

答案 1 :(得分:1)

基本上,您希望使生活参考无效。这将打破使用自动内存管理的语言的关键假设,这是无法解决无效指针的问题。至少在Java中,这肯定是不可能的,我邀请C#专家使用C#特定信息为这个社区维基做贡献。

为了解决您的要求:您必须将对象的引用封装在另一个对象中,并且永远不要让引用转义,以确保该引用的100%所有权。所以外部对象需要复制内部对象的完整API,基本上是 Decorator 模式。

如果您这样做,您可以随时选择将内部引用设置为null,从而可靠地释放对象。

答案 2 :(得分:0)

您无法通过托管语言引用从内存中删除对象。

您可以通过将引用设置为Null并调用GC.Collect()

将其从C#中的内存中删除