首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >例如,是否有可能销毁/删除self?

例如,是否有可能销毁/删除self?
EN

Stack Overflow用户
提问于 2013-07-05 18:25:01
回答 8查看 24.3K关注 0票数 13

注意:我对C#、Java和C++最感兴趣,但这是任何语言都能解决的更多的学术问题。

我知道这个问题是可以从外部解决的,通过使用给定语言的适当方法(调用freeDispose或删除对实例的所有引用)。

我的想法是创建一个实例,并在构造函数中启动私有计时器。当计时器结束时,它将调用某个实例方法并销毁变量。

我认为在C#中,当IDisposable被实现时,应该可以在self上调用Dispose,但这不会破坏实例。

在C++中,我可以调用destructor,但这会导致内存泄漏,而且这是非常糟糕的做法。

在Java中我不知道,因为它是final字段,所以不可能赋值给this

那么,有没有什么方法可以毁掉自己呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-07-05 18:54:34

你的问题非常有趣,我不知道在C#中还有什么其他方法可以做到这一点,只能从实例内部强制从外部销毁它。所以这就是我想出的方法来验证它是否可行。您可以创建类Foo,该类具有在计时器的特定时间间隔过去时触发的事件。在event中注册到该事件(Bar)的类将注销该事件,并将实例的引用设置为null。这就是我怎么做的,经过测试,它是有效的。

代码语言:javascript
复制
public class Foo
{
    public delegate void SelfDestroyer(object sender, EventArgs ea);

    public event SelfDestroyer DestroyMe;

    Timer t;

    public Foo()
    {
        t = new Timer();
        t.Interval = 2000;
        t.Tick += t_Tick;
        t.Start();
    }

    void t_Tick(object sender, EventArgs e)
    {
        OnDestroyMe();
    }

    public void OnDestroyMe()
    {
        SelfDestroyer temp = DestroyMe;
        if (temp != null)
        {
            temp(this, new EventArgs());
        }
    }
}

public class Bar
{
    Foo foo;
    public Bar()
    {
        foo = new Foo();
        foo.DestroyMe += foo_DestroyMe;
    }

    void foo_DestroyMe(object sender, EventArgs ea)
    {
        foo.DestroyMe -= foo_DestroyMe;
        foo = null;
    }
}

为了测试这一点,您可以在表单中设置一个按钮单击,就像这样,并在调试器中检查它:

代码语言:javascript
复制
Bar bar = null;
private void button2_Click(object sender, EventArgs e)
{
       if(bar==null)
             bar = new Bar();
}

因此,下次单击该按钮时,您将能够看到Bar实例仍然存在,但其中的Foo实例是空的,尽管它是在Bar的构造函数中创建的。

票数 10
EN

Stack Overflow用户

发布于 2013-07-05 18:43:23

C++:如果一个对象是动态分配的,它可以在它自己的函数中删除它的this指针,前提是this指针在该指针之后再也不会被使用。

票数 3
EN

Stack Overflow用户

发布于 2013-07-05 18:30:53

不,没有办法在C#中实现您想要做的事情。

如果你考虑一个例子:

代码语言:javascript
复制
public class Kamikadze {

     ......             
     private void TimerTick(..) 
     {
        ....
        if(itsTime) {
            DestroyMe();
        }
     }

     .....
}


var kamikadze = new Kamikadze ();

一段时间后,将调用清理内部数据的DestroyMe()

但是引用kamikadze (如果你愿意的话,指针)仍然有效,并且指向那个内存位置,所以GC不会做任何事情,也不会收集它,Kamikadze的实例将保留在内存中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17486608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档