2GTK# 如何正确清理小部件、内存泄漏

我实际上正在开发由 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() )以确保小部件没有链接到其他东西。


在我的主窗口中,我只是在 à 列表中创建这些标签,然后通过对每个标签调用 Dispose 方法来删除它们。我所有的小部件似乎都被删除了,但我总是有一些Glib。切换引用,Glib。您可以在我的内存快照中看到的信号:

http://img2.mukewang.com/60f2958f00010f0009260782.jpg

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



白衣非少年
浏览 232回答 1
1回答

Qyouu

当我通过在 destroy 方法中调用 Glib Dispose 来销毁小部件时,我最终编辑了 GTK 锐利库以删除切换引用。我的对象数量不会快速增长,并且在需要时我的所有对象都会被删除!
打开App,查看更多内容
随时随地看视频慕课网APP