`
weiyuhu
  • 浏览: 237762 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

一次GTK程序内存泄露的解决过程发现的两个内存泄露的问题

阅读更多
集成测试的时候发现一个程序在持续的运行过程中有缓慢的内存增长。用ValGrind来查并没有太多的发现。询问开发人员的时候,他说GTK的内存好象都有一些泄露,网上有文曰

If GtkFoo isn't a toplevel window, then

foo = gtk_foo_new ();


gtk_widget_destroy (foo);


is a memory leak。

   这个我是不相信的,于是有了两个内存泄露的问题需要解释。

1、我们的程序为什么内存泄露?在放弃了工具帮忙后,逐段代码注释,注释后并细心观察内存半个小时后记录内存起伏情况。最后发现我们的代码确实有问题。

                GList *list_child;

                ......

                list_child=gtk_container_get_children (GTK_CONTAINER (button));
                fixed=GTK_WIDGET(list_child->data);

                list_child=gtk_container_get_children (GTK_CONTAINER (fixed));
                image=GTK_WIDGET(list_child->data);
              
                shadow=button_array_item->shadow;

   我们想当然认为list_child不用释放,是容器内部管理的GList列表,实际上,文档明确说返回值是一个newly-allocated的list :
gtk_container_get_children ()

GList

*              gtk_container_get_children          (GtkContainer

*container);

Returns the container's non-internal children. See gtk_container_forall() for details on what constitutes an "internal" child.

container  :
a GtkContainer

Returns  :
a newly-allocated list of the container's non-internal children.

2、同事说的例子为什么有内存泄露?找了文章看到下面的解释
1.5.

Why does my program leak memory, if I destroy a widget immediately after creating it ?
 

If GtkFoo isn't a toplevel window, then

foo = gtk_foo_new ();


gtk_widget_destroy (foo);


is a memory leak, because no one assumed the initial floating reference. If you are using a widget and you aren't immediately packing it into a container, then you probably want standard reference counting, not floating reference counting.

To to get this, you must acquire a reference to the widget and drop the floating reference (“ref and sink ” in GTK+ parlance) after creating it:

foo = gtk_foo_new ();


g_object_ref (foo);


gtk_object_sink (GTK_OBJECT (foo));


When you want to get rid of the widget, you must call gtk_widget_destroy() to break any external connections to the widget before dropping your reference:

gtk_widget_destroy (foo);


g_object_unref (foo);


When you immediately add a widget to a container, it takes care of assuming the initial floating reference and you don't have to worry about reference counting at all ... just call gtk_widget_destroy() to get rid of the widget.
分享到:
评论

相关推荐

    Android内存泄露检测_mat

    内存泄露是Android应用程序开发中常见的问题,可能导致应用性能下降,用户体验变差,甚至导致应用崩溃。为了有效地检测和解决这些问题,开发者通常会使用各种工具,其中Eclipse Memory Analyzer Tool (MAT)是一个...

    MemoryAnalyzer-1.12.0.20210602-linux.gtk.x86_64.zip

    5. **比较heap dump**:MAT还可以比较两个不同的heap dump文件,揭示内存使用的变化,这对于追踪内存泄漏问题的演变过程非常有用。 6. **碎片分析**:MAT可以分析堆内存的碎片化程度,提供优化内存分配的建议,以...

    应用SDL及GTK实现视频多路回放

    本话题主要关注如何利用SDL(Simple DirectMedia Layer)和GTK(GIMP Toolkit)这两个库来实现视频的多路回放功能。SDL是一个跨平台的多媒体库,专注于底层的图形、音频处理以及游戏开发,而GTK则是一个用于创建图形...

    MemoryAnalyzer-1.8.0.20180604-linux.gtk.x86_64.zip

    “MAT”的另一个强大特性是“Differential Heap Analysis”,它可以比较两个不同的hprof文件,揭示内存状态的变化,这对于追踪内存泄漏问题尤其有效。同时,MAT还提供了“Shallow Heap”和“Retained Heap”两个指标...

    MemoryAnalyzer-1.10.0.2020022-linux.gtk.x86_64.zip

    4. **泄露嫌疑犯报告**:这个报告通过比较两个堆转储,找出可能的内存泄漏点,提供了一份详细的疑似泄漏对象列表。 5. **大对象分析**:MAT可以检测出内存中的大对象,这些对象可能导致频繁的垃圾收集,影响系统...

    MemoryAnalyzer-1.7.0.20170613-linux.gtk.x86_64.zip

    6. **对比分析**:MAT允许开发者对比两个不同的内存快照,从而查看内存状态的变化,这对于追踪内存泄漏的发展趋势尤为有效。 使用MAT时,开发者需要先在运行Android应用的设备或模拟器上生成一个hprof文件,然后...

    MAT内存分析工具.zip

    在给定的压缩包“MAT内存分析工具.zip”中,包含了两个不同版本的MAT:MemoryAnalyzer-1.7.0.20170613-linux.gtk.x86_64.zip和MemoryAnalyzer-1.10.0.20200225-linux.gtk.x86_64.zip。这两个版本分别对应于2017年6月...

    利用GTK、WebKit,建立基于HTML的Python图形用户界面

    通过封装退出功能,可以确保程序在退出前能够正确地释放资源,避免潜在的内存泄露等问题。 在构建应用的过程中,开发者还需要熟悉一些预备知识,包括JavaScript代码、HTML代码和Python代码。JavaScript用于实现与...

    MemoryAnalyzer-1.10.0.zip

    它的主要功能是帮助开发者诊断和解决Java应用程序中的内存泄漏问题,以及优化内存使用效率。在版本1.10.0中,MAT为Windows和Linux 64位系统提供了支持,使得用户无论在哪个操作系统环境下都能进行高效的内存分析。 ...

    MemoryAnalyzer MAT linux x86-64

    6. **Shallow Heap和Retained Heap**:这两个概念是MAT分析的关键,shallow heap表示一个对象本身占用的内存,而retained heap则包括该对象及其所有被引用对象占用的总内存,后者对于识别内存泄漏更为重要。...

    一套图像处理程序,支持JPEG、GIF  

    在IT领域,图像处理是一项关键的技术,特别是在多媒体应用、网页设计、数字艺术和科学可视化等方面。...通过这个程序,开发者不仅可以深入理解图像处理原理,还能锻炼实际的编程技巧和问题解决能力。

    bookmark

    "bookmark"项目就是一个结合了这两个方面的典型案例,它使用MySQL作为后端数据库管理系统,以及GTK作为前端图形用户界面(GUI)工具包。本文将深入探讨这个小程序的核心技术和实现细节。 首先,MySQL是世界上最流行...

    LINUX应用程序开发指南.zip

    本指南将主要围绕两个核心主题展开:Linux GUI(图形用户界面)编程框架与编程基础,以及Linux编程常用的C语言函数库和构件库。以下是对这两个主题的详细阐述。 一、Linux GUI编程框架及编程基础 1. GTK+(GIMP ...

    calculator 计算器

    "calculator 计算器"项目是一个使用GTK图形用户界面库编写的计算器应用。GTK,全称为GIMP ToolKit,是一个广泛使用的开源GUI构建工具,支持多种操作系统,如Linux、Windows和macOS。这个计算器程序的独特之处在于其...

    Linux应用程序开发详解

    - valgrind检测内存泄漏和其他常见问题。 通过深入学习以上知识点,开发者能够熟练地在Linux环境下进行应用程序开发,解决各种实际问题。"Linux应用程序开发详解"这份资源应该会涵盖这些内容,并可能提供实例和...

    嵌入式Linux应用程序开发详解

    嵌入式Linux应用程序开发是将Linux操作系统应用于小型设备或特定硬件平台的过程,这些设备通常具有有限的计算资源。本教程是针对希望进入这个领域的初学者设计的,它将引导你了解如何在嵌入式环境中创建和优化应用...

    调色器调色板程序C++源码

    本主题聚焦于使用C++实现的“调色器”和“调色板”程序,这两个概念在图形用户界面(GUI)设计和图像处理中至关重要。 调色器通常是一个允许用户选择颜色的工具,它提供了丰富的色彩选择,可以用于网页设计、图形...

    rust.docxrust.docxrust.docx

    通过所有权系统和生命周期检查机制,Rust 可以在编译时检测到许多潜在的内存安全问题,从而避免了运行时的数据竞争和内存泄漏等问题的发生。这种机制有效地降低了开发复杂系统时出现的常见错误,提高了软件的质量和...

    简易画板(C语言期末作业)

    6. **内存管理**:在分配和释放内存时,要避免内存泄漏,熟悉malloc和free等动态内存管理函数。 7. **错误处理**:良好的编程习惯包括添加适当的错误处理代码,以应对可能出现的问题,如无效输入或资源不足。 8. *...

Global site tag (gtag.js) - Google Analytics