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。我的对象数量增长不快,我的所有对象都在需要时被删除!