强制从内存中删除对象
本文关键字:删除 对象 内存 | 更新日期: 2023-09-27 18:14:18
我怎么能删除对象,即使它有引用(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,我该怎么做?
你不能,简单地说。
如果您确实想实现类似的东西,您可以通过代理引用您的Person
,并传递代理。因此,您可以将底层Person引用设置为null(简单地表示对象可用于删除—而不是强制删除),但客户端仍将包含代理引用。
您可能想要检查Java的软引用和弱引用,它们是相关的,并且可以在垃圾收集周期中丢弃对象,尽管它们的弱/软引用在其他地方可用。
不能使用托管语言中的引用从内存中删除对象。
在c#中,你可以通过将引用设置为Null并调用GC.Collect()基本上,您希望使活引用无效。这将打破具有自动内存管理的语言的关键假设,即不可能解除对无效指针的保护。至少在Java中,这肯定是不可能的,我邀请了一位c#专家为这个社区wiki贡献c#相关信息。
对你的需求的解决方案:你必须封装引用到你的对象在另一个和永远不会让引用转义,以确保100%的所有权,该引用。所以外部对象需要复制内部对象的完整API,基本上是Decorator模式。
如果您这样做,您可以选择在任何时候将内部引用设置为null
,从而可靠地释放对象。