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

cl25kdpy  于 2023-03-09  发布在  .NET
关注(0)|答案(1)|浏览(100)

我实际上正在开发一个由GTK# 2.12支持的软件,我们有一些内存泄漏,我正在寻找如何改进它。
我做了一个小应用程序来测试摆脱小部件的正确方法。我创建了10000个标签,然后我删除它们。
下面是我的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. togglerefGlib. Signal,正如你在我的内存快照中看到的:
Memory snapshot
我不知道怎样才能摆脱它,如果你能帮我解决这个问题,我将不胜感激
大卫

syqv5f0l

syqv5f0l1#

我最后编辑了GTK sharp库,当我在destroy方法中调用Glib Dispose来销毁一个小部件时,删除了toggleref。我的对象数增长得不快,并且在需要的时候我的所有对象都被删除了!

相关问题