C# GTK#-内存泄漏

C# GTK#-内存泄漏,c#,memory-leaks,gtk,gtk3,C#,Memory Leaks,Gtk,Gtk3,我使用gtk for Windows(gtk 2.99.3)创建了一个简单的gtk应用程序 在视图创建和删除过程中,我发现内存泄漏。因此,我编写了一个简单的应用程序来验证这一点: private static void MemoryTest() { //Create the view Gtk.Builder builder = new Gtk.Builder(null, "Modules.Dashboard.Dashboard.ui", n

我使用gtk for Windows(gtk 2.99.3)创建了一个简单的gtk应用程序

在视图创建和删除过程中,我发现内存泄漏。因此,我编写了一个简单的应用程序来验证这一点:

        private static void MemoryTest()
    {
        //Create the view
        Gtk.Builder builder = new Gtk.Builder(null, "Modules.Dashboard.Dashboard.ui", null);


        //Create the parameters
        object[] parameters = new object[3] { builder, builder.GetObject("window1").Handle, 0 };
        //Load the current view
        var view = (ViewBase)Activator.CreateInstance(typeof(DashboardView), parameters);


        //TRY TO DESTROY;
        view.Destroy();
        builder.Dispose();

        view.Dispose();
    }
该函数被调用10000次:

        for(int i = 0; i < 10000; i++)
            MemoryTest();
        Console.WriteLine("Run GC");
        System.GC.Collect(GC.MaxGeneration, GCCollectionMode.Default, true);

        Console.WriteLine("Finsih GC");

        Thread.Sleep(TimeSpan.FromSeconds(30));
        for(int i = 0; i < 10000; i++)
            MemoryTest();
for(int i=0;i<10000;i++)
记忆测试();
Console.WriteLine(“运行GC”);
System.GC.Collect(GC.MaxGeneration,GCCollectionMode.Default,true);
Console.WriteLine(“Finsih GC”);
睡眠(时间跨度从秒(30));
对于(int i=0;i<10000;i++)
记忆测试();
在该应用程序的执行过程中,所需的内存不断增加

删除整个窗口是否需要进一步的步骤

我的.ui文件:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkGrid" id="view">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="row_homogeneous">True</property>
        <property name="column_homogeneous">True</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Ich</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">0</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label2">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">bin</property>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="top_attach">0</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label3">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">ein</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label4">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Dashboard</property>
          </object>
          <packing>
            <property name="left_attach">1</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

假的
真的
假的
真的
真的
真的
假的
脑出血
0
0
1.
1.
真的
假的
箱子
1.
0
1.
1.
真的
假的
艾因
0
1.
1.
1.
真的
假的
仪表板
1.
1.
1.
1.

GtkWindows(并且只有GtkWindows)是使用
builder.GetObject()创建的。
您有责任销毁;GtkBuilder为您创建对窗口的另一个引用。请参阅。我试图通过以下方式更改代码
var window1=builder.GetObject(“window1”);object[]parameters=新对象[3]{builder,window1.Handle,0}//试图破坏;view.Destroy();builder.Dispose();view.Dispose();window1.Dispose()builder.GetObject()
创建的GtkWindows(仅GtkWindows)将由您负责销毁;GtkBuilder为您创建对窗口的另一个引用。请参阅。我试图通过以下方式更改代码
var window1=builder.GetObject(“window1”);object[]parameters=新对象[3]{builder,window1.Handle,0}//试图破坏;view.Destroy();builder.Dispose();view.Dispose();window1.Dispose()