質問

したC++ライブラリを提供する場合は、それぞれの設定おります。最近のスイッチを使用原料のポインタのインターフェースを使用力::sharedptrです。これは大きな恩恵という、現在のお客様でなくなったのニーズを削除するか、です。いきたいと考えていますのスイッチにいると考えていたのは良いことで困っていましたが含から何かのサードパーティライブラリにて公開インタフェース-一般的にすることを避けるようなことがいえるでしょうができます。私は合理的であげた実際にはC++言語現在、当社利用の場合は両方のクライアントコードの図書館での開催へのポインタをオブジェクト。しかし、最近のお客様から求められまでにスイッチを中立的なスマートポインタークラスのインタフェースでライブラリは本質的に強制的に特定のバージョンのブースト、ポイント確かに理解と認識を目的とする.それで私は何が最善なのかもしれません。について考えてみたので、少しかつ簡単にスマートポインタークラスでの開催は拡大スマートポインタです。その後は、お客様のうすぐもののその味の向上::sharedptr、そして私たちはあなた三つの共通のポインタの深い問題でもない。とにかくプレイしていただければと思いが聞こえてくるようになっ意見は、地域社会からの必要がありません。

編集:私はもともと言った所有権移転がったものの指定されたコードの両面にAPIの境界となるポインタをオブジェクトです。

役に立ちましたか?

解決

shared_ptr <!> lt; <!> gt; TR1のリリース時点では、 は言語の一部です。 参照:(TR1)

他のヒント

可能な解決策の1つは、プロジェクトにboost :: shared_ptrを同梱することです。すべてヘッダーで構成されているため、これにより、クライアントがブーストライブラリを手動でインストールする必要がなくなります。 bcp を使用して、ライブラリ自体を含む特定のブーストライブラリ。当時会社で働いていたときにboost::shared_ptrが必要だったので、それを実際に行いました。

セマンティクスが本当に所有権の移転である場合、標準のC ++であるauto_ptrを使用しないのはなぜですか?内部的には、auto_ptrからshared_ptrを作成し、必要に応じて所有権を共有できます。

まず、また図書館としてのソースコードではなく、コンパ図書館、無視できるこの答えになります。れているものもあwindows特有の問題点とする当該他プラットフォームへの対応

個人的にという思いを大切にしていた事は避けたほうがいいでしょうぎるとファンキーなc++の公開インタフェースの図書館での原因となる多くの問題です。

なんなのかどう適用する特定の例が、私は個人的には問題が記号からstl図書館を使った抵のものを第三者に図書館は私に新しいバージョン。こうした事故、不思議な場所にあったかいもさらにお得な価格での回避の問題です。最終的にまたは古いバージョンの図書館です。

他の問題ときには、それぞれのc++コンパイラでmangle同じ記号はないことを意味します可能性を提供する必要があり、別の図書館毎にコンパイラのサポートしたい場合でも同じブバージョン。チェックの"不完全なC++"を議論します。

現在の世界のC++コンパイラおよび環境だと思い、悲しいのが実情であることは避けるべきだともCインターフェースを下回る可能性があります。リンクラダ(益相反を回避するためのサイトにリンクされる場合お客様がリンクを図書館、windows runtime図書館で本当に苦痛はこちら)。にもそのままお使いいただけ増やして派手なc++の内側に図書館についてすべての記号もさらに向上することとなるお客様の環境にdll.

またスマートポインタとその他素敵なC++の機能がインターフェイスの図書館を構築し、利便性層での配布のソースコードです。ことなくいつでも、お客様の環境です。このインタフェースの呼び出自に晒されたCの関数になります。とは思わないで使うようにするといいでしょうに向上させること層のいずれかで力でお客様を採用する場合でも足りないという人もいたので交換してや他の液この層が分布してソースコード。

他の素敵な特徴は、一般的にするC関数の呼び出しのdllはc++の機能を変な名前の難号化したい場合な図書館を他の言語はC/C++.

このアプローチがいることで人生をより複雑な多くのものが少なる人を避ける図書館かけることができなかったリンクは成功のうちに幕を閉じた独自のコードです。

これはC ++です。ご存知のように、共有ポインターの実装を介してインターフェイスクラスをテンプレート化できます。

これは私がしばらく前から持っていた興味深い質問です。提供するライブラリにユーザーを強制しますか、それともプロジェクトで何が最適かを決定させますか?いつものように、質問はあなたが何を提供し、ユーザーに何を要求しているのかです。

生のポインタを使用する場合、あらゆる種類の可能性を許可します。ユーザーコードは生のポインターを使用して、std :: auto_ptr、shared_ptr(boostまたはTR1)、またはスマートポインターの自作バージョンに保存できます。ただし、メモリを解放するのを忘れると、ユーザーがトラブルに陥る可能性があり、メソッド呼び出しのために一時的に作成したいだけの場合は、さらにいくつかのコードが必要です(生のポインタを提供する場合は、一時的ではない[スマート]ポインター変数のポインター)。

今、スマートポインターを使用する場合、ソリューションをユーザーに強制します。スマートポインターの独自バージョンを使用する予定がある場合(たとえば、boost :: shared_ptrを使用していて、std :: tr1 :: shared_ptrが必要な場合)、インターフェイスで動作する場合は使用できません。 (特別なstd :: auto_ptr以外に)どのようなスマートポインターを決定したとしても、ソリューションを強制するだけでなく、それが抱える問題も抱えています。

ユーザーがマルチスレッドアプリケーションを使用しており、ソリューションがスレッドセーフでない場合、ユーザーは安全でないソリューションにバインドされます。一方、スマートポインターがスレッドセーフであるがロックコストが発生する場合、マルチスレッドアプリケーションで作業している場合でも、それらのコストはユーザーにプッシュされます。ライブラリ(ヘッダーのみのライブラリではなく)をコンパイルする場合、スマートポインターライブラリの変更はコードの互換性を破壊するため、スマートポインターのタイプだけでなく、その特定のバージョンも強制します。

補足として、boost :: shared_ptr(boost 1.33+)はほとんどの状況でスレッドセーフであり、多くのプラットフォームでロックフリーの実装を使用しています。とにかく、これはあなたが考慮すべきことのアイデアを提供するはずです。

最後に、ユーザーが自分のタイプのスマートポインターを使用するようにバインドするだけでなく、同じバージョンのスマートポインターも使用することを考慮する必要があります。特定のバージョンのboostに対してlibをコンパイルすると、ユーザーはその特定の実装にバインドされますo

ブーストコピーユーティリティを使用できます。スマートポインタークラスのみを備えたカスタムバージョンのBoostを構築します。 スマートポインタークラスはヘッダーのみのライブラリであるため、ライブラリに含めることができるヘッダーがいくつか生成されるはずです。

boost :: intrusive_ptr おそらく?

boost :: shared_ptrの導入により、クライアントは強制的にboostを使用するようになります。一部の人々にとって、これは小さな問題です。

また、libがコンパイル済みバイナリとして配布されている場合、クライアントがlibで使用されているのと同じコンパイラを使用するように強制します。または、ライブラリがソースコードで配布されている場合、クライアントは、ライブラリのコンパイルに使用するコンパイラの独自の選択に固執する必要があります。これは、かなりの規模のプロジェクトにとって小さな問題ではありません。

auto_ptrを使用するか、Cインターフェイスに固執します。インターフェイスにC ++ライブラリを強制すると、常に見苦しくなり、クロスプラットフォームになる可能性がなくなり、異なる<!> quot; downstream <!> quot;を持つ顧客にとってメンテナンスの悪夢が生じます。構成。

C ++ 0xがクライアントにとって十分な主流になったらすぐに、std::shared_ptrに切り替えます。

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