例如,是否可以销毁/删除自己?

2022-09-04 02:39:25

注意:我对C#,Java和C++最感兴趣,但这是任何语言都会做的更具学术性的问题。

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

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

我认为在C#中,当实现时,应该可以调用self,但这不会破坏instace。DisposeIDisposable

在C++我可以调用 ,但这会导致内存泄漏,而且这确实是不好的做法。destructor

在Java中,我不知道,分配到它是不可能的,因为它是字段。thisfinal

那么,有没有办法,比如,摧毁自我呢?


答案 1

你的问题非常有趣,我不知道在C#中还有其他方法可以做到这一点,除了从实例内部强制从外部破坏它。这就是我想出的检查是否可能。您可以创建类 ,该类具有在计时器的特定间隔过后触发的事件。在事件中注册到该事件 () 的类将取消注册该事件,并将实例的引用设置为 。这就是我将如何做到这一点,经过测试并发挥作用。FooBarnull

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;
    }
}

为了测试这一点,您可以在窗体中设置一个按钮单击,如下所示,然后在调试器中检查它:

Bar bar = null;
private void button2_Click(object sender, EventArgs e)
{
       if(bar==null)
             bar = new Bar();
}

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


答案 2

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