GTK#如何正确清理小部件,内存泄漏(Glib.toggleref,Glib.signal)

时间:2018-06-01 13:46:13

标签: c# .net memory gtk gtk#

我实际上正在开发一个由GTK#2.12驱动的软件,我们有一些内存泄漏,我正在寻找如何改进它。

我做了一个小应用来测试摆脱小部件的正确方法。我正在创建10 000个标签,然后我删除它们。

这是我的Label类:

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()),以确保小部件没有链接到其他东西。

在我的主窗口中,我只是在àlist中创建标签,并通过在每个标签上调用Dispose方法将其删除。我的所有小部件似乎都被删除了,但我总是有一些 Glib。 toggleref Glib。您可以在我的内存快照中看到信号

Memory snapshot

如果你可以帮我解决这个问题,我不知道如何摆脱它会非常感激

大卫

1 个答案:

答案 0 :(得分:0)

当我通过在destroy方法中调用Glib Dispose来销毁一个小部件时,我终于编辑了GTK sharp库以删除toggleref。我的物品数量不会快速增长,所有物品都会在需要时被删除!