【问题标题】:GTK# how to correctly clean widgets, memory leak (Glib.toggleref, Glib.signal)GTK# 如何正确清理小部件、内存泄漏(Glib.toggleref、Glib.signal)
【发布时间】:2018-06-01 13:46:13
【问题描述】:

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

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

这是我的标签类:

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

如果您能帮助我解决这个问题,我不知道如何摆脱它,我们将不胜感激

大卫

【问题讨论】:

    标签: c# .net memory gtk gtk#


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-13
      • 2012-02-12
      • 2016-05-31
      • 2012-04-16
      • 2021-03-28
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      相关资源
      最近更新 更多