C# GTK#-内存泄漏
我使用gtk for Windows(gtk 2.99.3)创建了一个简单的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
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()但是我遇到了同样的问题。内存还在增加…你也在泄漏对象数组吗?我不这么认为。我用.net内存分析器检查了它。据我所知,对象数组没有泄漏。第二个奇怪的行为是,在程序运行期间内存仍在增加,但.net内存探查器仅显示仪表板视图的一个实例。因此,我认为view类已被销毁,但某些gtk函数仍保留在内存中。使用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()但是我遇到了同样的问题。内存还在增加…你也在泄漏对象数组吗?我不这么认为。我用.net内存分析器检查了它。据我所知,对象数组没有泄漏。第二个奇怪的行为是,在程序运行期间内存仍在增加,但.net内存探查器仅显示仪表板视图的一个实例。因此,在我看来,视图类被销毁了,但是一些gtk函数仍然保存在内存中。