注意:我对C#、Java和C++最感兴趣,但这是任何语言都能解决的更多的学术问题。
我知道这个问题是可以从外部解决的,通过使用给定语言的适当方法(调用free、Dispose或删除对实例的所有引用)。
我的想法是创建一个实例,并在构造函数中启动私有计时器。当计时器结束时,它将调用某个实例方法并销毁变量。
我认为在C#中,当IDisposable被实现时,应该可以在self上调用Dispose,但这不会破坏实例。
在C++中,我可以调用destructor,但这会导致内存泄漏,而且这是非常糟糕的做法。
在Java中我不知道,因为它是final字段,所以不可能赋值给this。
那么,有没有什么方法可以毁掉自己呢?
发布于 2013-07-05 18:54:34
你的问题非常有趣,我不知道在C#中还有什么其他方法可以做到这一点,只能从实例内部强制从外部销毁它。所以这就是我想出的方法来验证它是否可行。您可以创建类Foo,该类具有在计时器的特定时间间隔过去时触发的事件。在event中注册到该事件(Bar)的类将注销该事件,并将实例的引用设置为null。这就是我怎么做的,经过测试,它是有效的。
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();
}因此,下次单击该按钮时,您将能够看到Bar实例仍然存在,但其中的Foo实例是空的,尽管它是在Bar的构造函数中创建的。
发布于 2013-07-05 18:43:23
C++:如果一个对象是动态分配的,它可以在它自己的函数中删除它的this指针,前提是this指针在该指针之后再也不会被使用。
发布于 2013-07-05 18:30:53
不,没有办法在C#中实现您想要做的事情。
如果你考虑一个例子:
public class Kamikadze {
......
private void TimerTick(..)
{
....
if(itsTime) {
DestroyMe();
}
}
.....
}
var kamikadze = new Kamikadze ();一段时间后,将调用清理内部数据的DestroyMe()。
但是引用kamikadze (如果你愿意的话,指针)仍然有效,并且指向那个内存位置,所以GC不会做任何事情,也不会收集它,Kamikadze的实例将保留在内存中。
https://stackoverflow.com/questions/17486608
复制相似问题