0

Qt5 アプリケーションで libtorrent を使用しようとしていますが、malloc(): メモリ破損のようなメッセージで segfault が発生し続けます。何時間もデバッグした後、この問題を引き起こすこの小さなコードを思いつきました。

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    std::string filename = "fedora.torrent";
    libtorrent::error_code ec;
    libtorrent::add_torrent_params parameters;
    std::cerr << "111\n";
    parameters.ti = new libtorrent::torrent_info(filename, ec);;
    std::cerr << "222\n";
    return app.exec()
}

この場合、torrent_info のコンストラクターが segfault を生成します。しかし、次のように QGuiApplication を作成する前に libtorrent 関連のコードを移動すると:

int main(int argc, char *argv[])
{
    std::string filename = "fedora.torrent";
    libtorrent::error_code ec;
    libtorrent::add_torrent_params parameters;
    std::cerr << "111\n";
    parameters.ti = new libtorrent::torrent_info(filename, ec);;
    std::cerr << "222\n";
    QGuiApplication app(argc, argv);
    return app.exec()
}

その後、問題なく動作します。また、この問題は 32 ビット ビルドにのみ存在し、64 ビット ビルドでは両方のバリアントが同じように機能します。

4

1 に答える 1

1

TORRENT_これは、 * 定義の 1 つのセットを使用して libtorrent をビルドし、別のセットを使用してリンクすることが原因である可能性が最も高いです。これらの定義の一部は、パブリック API で使用される一部の構造体のレイアウトに影響し、呼び出し元のアプリケーションとライブラリが異なる場合、ABI の非互換性の問題が発生します。

于 2013-11-25T09:39:20.560 に答える