2017-02-13 19 views
0

qt-creator 3.5.1でqt5.5.1を使用していて、GeoDataStyleを使用してGeoDataPlacemarkにスタイルを設定しようとしています。それは正常に動作していましたが、直接ポインターの代わりに共有ポインターを使用するMarbleのアップデートの後に、私のプログラムのsegフォールトが発生しました。 GDBを使用して、私はstyleArchダイレクトポインタでQSharedPointerを作成する行にsegフォルトをトレースしました。誰が問題になるのか考えている人はいますか?Qt5でQSharedPointersを使用したときのSegフォルト

次のように私の古いコードだった

次のように

styleArch->setIconStyle(*icon); 
place->setStyle(styleArch); //Old Marble 

新しい大理石のAPIを使用して新しいコードは、次のとおりです。お時間を

styleArch->setIconStyle(*icon); 
place->setStyle(Marble::GeoDataStyle::Ptr(styleArch)); //New Marble 

ありがとう!

答えて

1

行:Marble::GeoDataStyle::Ptr(styleArch)は一時的なQSharedPointerを作成し、styleArchをポインタとして渡します。 QSharedPointerはこの時点でstyleArch *の所有権を取得します。これは以前に所有されていたstyleArch *にはそれ以上所有していないことを意味します。

setStyle方法は、先ほど作成し、簡単にそれを使用して、一時的なQSharedPointerへconst参照がかかりますが、(それはconstのため)重要なのは、QSharedPointerの参照カウンタをインクリメントしません。

これは、setStyleの呼び出しが完了すると、一時的なQSharedPointerがスコープ外になり(デストラクタを呼び出す)、ヒープからstyleArchオブジェクトを削除することを意味します。これは、styleArch *の元の所有者が現在無効なポインタを保持しているとは考えていないため、あなたを悪い方法で残します。 styleArch *をそれ以上使用すると、segfaultが発生します。

最も簡単な修正は、styleArch *のオーナーを更新してQSharedPointer <を保持し、代わりにスタイルアーチを使用することです。

+0

こんにちは、お返事ありがとうございます!あなたのコメントは正しい方向に私を指摘しました。 QSharedPointerタイプの新しい変数を作成しました。 'styleArchSP = QSharedPointer (新しいGeoDataStyle);styleArchSP-> setIconStyle(* icon); place-> setStyle(styleArchSP); ' –

+0

正確に。 styleArchSPとしてsharedpointerをインスタンス化することにより、その存続期間がsetStyleの呼び出しを越えていることを保証します。これはseg faultの問題を解決しましたか? –

+0

はい、そうでした。どうもありがとうございました! –

関連する問題