GTK # как правильно чистить виджеты, утечка памяти (Glib.toggleref, Glib.signal) - PullRequest
0 голосов
/ 01 июня 2018

На самом деле я работаю над программным обеспечением на базе 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 ()), чтобы убедиться, что виджет не связан с чем-то другим.

В моем главном окне я просто создаю эти ярлыки в спискеи удалите их, вызвав метод Dispose для каждого из них.Кажется, все мои виджеты удалены, но у меня всегда есть Glib.toggleref , Glib.Сигнал , как вы можете видеть на моем снимке памяти:

Снимок памяти

Я не представляю, как мне от него избавиться, если выможет помочь мне с этой проблемой, он будет очень признателен

Дэвид

1 Ответ

0 голосов
/ 04 июня 2018

Я наконец отредактировал GTK sharp библиотеку, чтобы удалить toggleref, когда я уничтожаю виджет, вызывая Glib Dispose в методе destroy.Количество моих объектов не растет быстро, и все мои объекты удаляются при необходимости!

...