質問

ブースト共有ポインターを返し、それをパラメーターとして使用する DLL を C++ で開発することは有効ですか?

では、このような関数をエクスポートしても大丈夫でしょうか?

1.) boost::shared_ptr<Connection> startConnection();
2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);

特別に:参照カウントは DLL の境界を越えて機能しますか、それとも exe と dll が同じランタイムを使用することが要件になりますか?

その目的は、オブジェクトの所有権に関する問題を克服することです。したがって、dll と exe の両方がそれを参照しなくなると、オブジェクトは削除されます。

役に立ちましたか?

解決

Scott Meyers によると、『Effective C++ (3rd Edition)』では、shared_ptr は DLL の境界を越えて安全です。shared_ptr オブジェクトは、それを作成した DLL からのデストラクターへのポインターを保持します。

彼の著書の項目18で、彼は次のように述べています。 tr1::shared_ptr は、ポインターごとの削除機能を自動的に使用することです 別の潜在的なクライアント エラーである "DLL 間問題" を排除します。 この問題は、オブジェクトが 1 つのオブジェクトで new を使用して作成されたときに発生します ダイナミック リンク ライブラリ (DLL) ですが、別の DLL で削除されています。オン 多くのプラットフォームでは、このようなクロスDLLの新規/削除ペアはランタイムにつながります エラー。tr1::shared_ptr は、デフォルトのデリータであるため、 tr1::shared_ptr が作成されたのと同じ DLL から削除を使用します。

ただし、ティム・レッシャー氏は注意すべき興味深い落とし穴があると述べています。 ここ. 。shared_ptr が最終的に範囲外になる前に、shared_ptr を作成した DLL がアンロードされていないことを確認する必要があります。ほとんどの場合、これは注意する必要はありませんが、疎結合の DLL を作成している場合は、shared_ptr を使用しないことをお勧めします。

もう 1 つの潜在的な欠点は、両方の側が互換性のあるバージョンのブースト ライブラリで作成されていることを確認することです。Boost のshared_ptr は長い間安定しています。少なくともそれ以来 1.34 tr1と互換性がありました。

他のヒント

それは標準ではありません、それはあなたのライブラリによって提供されるオブジェクト/メカニズムではない場合は、私の意見では、それは、ライブラリへのインタフェースの一部であってはなりません。あなたは、参照カウントを行うには、独自のオブジェクトを作成し、そしておそらくブーストの下を使用しますが、それが明示的インターフェイスで公開すべきではないことができます。

のDLLんではない、通常、独自のリソース - リソースは、DLLを使用するプロセスによって所有されています。おそらく、より良いあなたがして、呼び出し側の共有ポインタに格納平野ポインタを返すオフになっています。しかし、より多くの情報なしで、それはこの約100%特定することは困難です。

あなたは、DLLインターフェイスからの生のポインタを公開する場合に目を光らせへ何か。それはあなたが別のCRTで割り当てを解除することができない1 CRTに割り当てられた共有DLL CRT、メモリを使用するように強制します。あなたが使用している場合、あなたはいけない場合は、これらすべての共有と同じヒープは、あなたがCRTの微交差されていると世界がメルトダウンします。

すべてのモジュール(DLLの&exeファイルの)にCRT DLLの共有

それ以外の点の問題から、私は受け入れ答えに同意します。作成工場は、おそらくクライアントコードの所有権&ライフサイクル管理を定義するべきではありません。

はありません、それはないです。

boost::shared_ptr<T>のレイアウトは、DLLの境界の両側で同じではないかもしれません。 (レイアウトがプラグマパッキング、コンパイラのバージョンによって影響され、他のコンパイラオプション、ならびにブースト・ソース・コードの実際のバージョン。)

のみ「標準レイアウト」(旧「POD =平野古いデータ」の概念に関連するC ++ 11の新コンセプト、)のタイプは安全に個別に構築されたモジュール間で渡すことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top