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

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 に答える
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 に答える