3

我有 gstreamer 的内存泄漏:

#include <iostream>
#include <string.h>
#include <glib.h>
#include <gst/gst.h>

using namespace std;

void info(const GstElement *const element)
{
        cout << "count: " << GST_OBJECT_REFCOUNT(element) << endl;
        cout << "disposing: " << GST_OBJECT_IS_DISPOSING(element) << endl;
}

int main()
{
    gst_init(NULL,NULL);
    GstElement *element = gst_pipeline_new("src");
    info(element);
    gst_object_unref(element);
    info(element);
    gst_deinit();
    return 0;
}

当我用 valgrind 控制我的代码时,我得到了这个结果:

==9098== 命令:./test_gstreamer
==9098==
计数:1
处置:0
计数:0
处置:0
==9098==
==9098== 堆摘要:
==9098== 退出时使用:2,199 个块中的 1,364,118 个字节
==9098== 总堆使用量:21,877 次分配,19,678 次释放,3,899,417 字节分配
==9098==
==9098== 泄漏摘要:
==9098== 肯定丢失:1 个块中的 60 个字节
==9098== 间接丢失:10 块 240 字节
==9098== 可能丢失:880 个块中的 543,952 个字节
==9098== 仍然可以访问:1,308 个块中的 819,866 个字节
==9098== 抑制:0 个块中的 0 个字节
==9098== 使用 --leak-check=full 重新运行以查看泄漏内存的详细信息
==9098==
==9098== 对于检测到和抑制的错误计数,重新运行:-v
==9098== 错误摘要:来自 0 个上下文的 0 个错误(抑制:2 个来自 2)

为什么不gst_object_unref释放所有内存?为什么GST_OBJECT_IS_DISPOSING返回 false 之后gst_object_unref

4

2 回答 2

1

您可以尝试将您的主要更改为:

gst_init(NULL,NULL);
GstElement *element = gst_pipeline_new("src");
info(element);
gst_element_set_state (element, GST_STATE_NULL);
gst_object_unref(element);
info(element);
return 0;

认为这可能有效。

于 2012-07-04T16:02:56.867 回答
1

您应该按照 valgrind 的建议进行操作:“使用 --leak-check=full 重新运行以查看泄漏内存的详细信息”。在这里查看答案:http: //gstreamer-devel.966125.n4.nabble.com/Valgrind-error-with-gstreamer-td4657149.html

当 gst_object_unref 返回时,该元素已完成处理。

于 2013-06-26T22:48:05.390 回答