GTK# 如何正确清理小部件、内存泄漏 (Glib.toggleref, Glib.signal)
GTK# how to correctly clean widgets, memory leak (Glib.toggleref, Glib.signal)
我实际上正在开发一个由 GTK# 2.12 提供支持的软件,我们有一些内存泄漏,我正在寻找如何改进它。
我制作了一个小应用程序来测试删除小部件的正确方法。我正在创建 10 000 个标签,然后删除它们。
这是我的标签 class:
namespace test_gtk_objects
{
public class TimeLabel : Label
{
private bool disposed = false;
protected DateTime _time;
public TimeLabel(DateTime time)
{
Time = time;
}
~TimeLabel()
{
Dispose(false);
Console.WriteLine("Called dispose(false) of class" + this.ToString());
GC.SuppressFinalize(this);
}
//dispose
public override void Dispose()
{
// Console.WriteLine("Called dispose(true) of class" + this.ToString());
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
Hide();
Unrealize();
Unparent();
Unmap();
Destroy();
Unref();
Console.WriteLine("ref: " + RefCount.ToString());
// Free any other managed objects here.
//
}
disposed = true;
base.Dispose();
}
protected void display(Label input_label)
{
input_label.Text = _time.ToString("HH:mm:ss");
}
internal DateTime Time
{
get { return _time; }
set
{
if (_time != value)
{
_time = value;
display(this);
}
}
}
}
}
如您所见,我已经按照建议覆盖了 dispose 方法。我还尝试了一些方法来释放大部分小部件(尤其是使用 unref() )以确保小部件没有链接到其他东西。
在我的主要 window 中,我只是在列表中创建这些标签,然后通过对每个标签调用 Dispose 方法来删除它们。我所有的小部件似乎都被删除了,但我总是有一些 能说会道。 toggleref, 油嘴滑舌。 Signal 正如你在我的内存快照中看到的那样:
Memory snapshot
我不知道如何摆脱它,如果你能帮助我解决这个问题,我将不胜感激
大卫
我最终编辑了 GTK sharp 库以在我通过在 destroy 方法中调用 Glib Dispose 销毁小部件时删除 toggleref。我的对象数量增长不快,我的所有对象都在需要时被删除!
我实际上正在开发一个由 GTK# 2.12 提供支持的软件,我们有一些内存泄漏,我正在寻找如何改进它。
我制作了一个小应用程序来测试删除小部件的正确方法。我正在创建 10 000 个标签,然后删除它们。
这是我的标签 class:
namespace test_gtk_objects
{
public class TimeLabel : Label
{
private bool disposed = false;
protected DateTime _time;
public TimeLabel(DateTime time)
{
Time = time;
}
~TimeLabel()
{
Dispose(false);
Console.WriteLine("Called dispose(false) of class" + this.ToString());
GC.SuppressFinalize(this);
}
//dispose
public override void Dispose()
{
// Console.WriteLine("Called dispose(true) of class" + this.ToString());
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing)
{
Hide();
Unrealize();
Unparent();
Unmap();
Destroy();
Unref();
Console.WriteLine("ref: " + RefCount.ToString());
// Free any other managed objects here.
//
}
disposed = true;
base.Dispose();
}
protected void display(Label input_label)
{
input_label.Text = _time.ToString("HH:mm:ss");
}
internal DateTime Time
{
get { return _time; }
set
{
if (_time != value)
{
_time = value;
display(this);
}
}
}
}
}
如您所见,我已经按照建议覆盖了 dispose 方法。我还尝试了一些方法来释放大部分小部件(尤其是使用 unref() )以确保小部件没有链接到其他东西。
在我的主要 window 中,我只是在列表中创建这些标签,然后通过对每个标签调用 Dispose 方法来删除它们。我所有的小部件似乎都被删除了,但我总是有一些 能说会道。 toggleref, 油嘴滑舌。 Signal 正如你在我的内存快照中看到的那样:
Memory snapshot
我不知道如何摆脱它,如果你能帮助我解决这个问题,我将不胜感激
大卫
我最终编辑了 GTK sharp 库以在我通过在 destroy 方法中调用 Glib Dispose 销毁小部件时删除 toggleref。我的对象数量增长不快,我的所有对象都在需要时被删除!