[解決済み] なぜC++のライブラリやフレームワークではスマートポインタが使われないのですか?
質問
いくつかの記事で、生のポインタはほとんど使ってはいけないと読みました。その代わりに、スコープ付きポインタや共有ポインタなど、常にスマートなポインタの内側にラップする必要があります。
しかし、QtやwxWidgetsのようなフレームワークやBoostのようなライブラリは、スマートポインタをまったく使っていないかのように、スマートポインタを返したり期待したりしないことに気づきました。その代わり、生のポインタを返したり、期待したりします。何か理由があるのでしょうか?パブリックAPIを書くときにスマートポインタを使わない方がいいのでしょうか?
ただ、多くの主要プロジェクトがスマートポインタを避けているようですが、なぜスマートポインタが推奨されているのでしょうか?
どのように解決するのですか?
多くのライブラリが標準的なスマートポインタの登場以前に書かれていることを除けば、最大の理由は標準的なC++アプリケーション・バイナリ・インタフェース(ABI)が存在しないことでしょう。
ヘッダのみのライブラリを書くのであれば、スマートポインタや標準コンテナを思う存分まわすことができる。これらのソースはコンパイル時にライブラリで利用できるため、実装ではなくインターフェイスの安定性だけに依存することになります。
しかし、標準的なABIがないため、一般的に
できない
は、モジュールの境界を越えて安全にこれらのオブジェクトを渡すことができます。GCC
shared_ptr
は、おそらくMSVCの
shared_ptr
とは異なる場合があります。
shared_ptr
. また
同じく
コンパイラを使用した場合、これらのクラスはバージョン間のバイナリ互換性が保証されません。
要するに、もしあなたが プリビルド バージョンのライブラリの場合、依存する標準的なABIが必要です。C言語にはありませんが、コンパイラベンダーは、特定のプラットフォームにおけるC言語ライブラリ間の相互運用性に非常に優れており、事実上の標準が存在するのです。
C++の場合は、状況はそれほどよくありません。個々のコンパイラはそれ自身のバイナリ間の相互運用を扱うことができますから、サポートされているすべてのコンパイラ、多くはGCCとMSVCのためのバージョンを配布するオプションがあります。しかし、この点を考慮すると、ほとんどのライブラリはC言語のインターフェイスをエクスポートするだけで、それは生のポインタを意味します。
しかし、ライブラリ以外のコードでは、一般的に生ポインタよりもスマートポインタを好むはずです。
関連
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] リファレンスとポインタの使い分け
-
[解決済み】なぜダブルインダイレクトを使うのか、なぜポインターをポインターにするのか?
-
[解決済み】スマートポインタ(boost)の説明
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件