1

私はWebkitGTKを試しています。Webページをダウンロードして終了するだけのシンプルな「HelloWorld」スタイルのアプリを使用して、WebKitはプログラムの実行後にリークされたオブジェクトを報告します。

LEAK: 1 CachedResource
LEAK: 12 WebCoreNode

WebkitGTKプログラムは、単純なCプログラムです。

#include <gtk/gtk.h>
#include <webkit/webkit.h>
#include <stdio.h>

static void load_status_callback(GObject* object, GParamSpec* pspec, void* window)
{
        WebKitWebView* view = WEBKIT_WEB_VIEW(object);
        WebKitLoadStatus status = webkit_web_view_get_load_status(view);

        switch (status) 
        {
            case WEBKIT_LOAD_FINISHED:
            {
                printf("WEBKIT_LOAD_FINISHED\n");
                gtk_main_quit();
                break;
            }
            default: g_assert_not_reached();
        }
};

int main(int argc, char* argv[])
{
    gtk_init(&argc, &argv);
    GtkWidget *main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(main_window), 800, 600);
    WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());

    GtkWidget *scrolledWindow = gtk_scrolled_window_new(NULL, NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledWindow),
    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_container_add(GTK_CONTAINER(scrolledWindow), GTK_WIDGET(webView));
    g_signal_connect(webView, "notify::load-status", G_CALLBACK(load_status_callback), main_window);
    gtk_container_add(GTK_CONTAINER(main_window), scrolledWindow);

    webkit_web_view_load_uri(webView, "http://127.0.0.1/test.html");
    gtk_widget_grab_focus(GTK_WIDGET(webView));
    gtk_widget_show_all(main_window);

    gtk_main(); // Run main event loop

    gtk_widget_destroy(main_window);

    return 0;
}

ダウンロードするHTMLは次のとおりです。

<html>
<head>
<script type = "text/javascript"></script>
</head>
<body>
<div id = "foo"></div>
</body>
</html>

いくつかの実験の後、タグを削除してもリークが発生しないことがわかり<script>ました。これにより、JavaScriptCoreをシャットダウンするために何かをすることになっていると思います。では、なぜWebKitがリークを報告しているのでしょうか。

4

1 に答える 1

1

これは、コードで間違ったことをしたわけではありません。問題は、WebKit のデバッグ ビルドを使用しているため、WebKit のバグ (WebKit 内で修正する必要があるメモリ リーク) が報告されていることです。

実際に何か特定のものをデバッグしようとしない限り、WebKit のリリース ビルドの使用に切り替える必要があります。デバッグ ビルドは遅く、アサーションを有効にして実行します。これは実際には、リリース ビルドよりも頻繁にクラッシュする原因となります。

于 2016-01-03T03:23:30.400 に答える