1. ホーム
  2. c++

[解決済み] なぜC++のライブラリやフレームワークではスマートポインタが使われないのですか?

2022-04-26 18:16:14

質問

いくつかの記事で、生のポインタはほとんど使ってはいけないと読みました。その代わりに、スコープ付きポインタや共有ポインタなど、常にスマートなポインタの内側にラップする必要があります。

しかし、QtやwxWidgetsのようなフレームワークやBoostのようなライブラリは、スマートポインタをまったく使っていないかのように、スマートポインタを返したり期待したりしないことに気づきました。その代わり、生のポインタを返したり、期待したりします。何か理由があるのでしょうか?パブリックAPIを書くときにスマートポインタを使わない方がいいのでしょうか?

ただ、多くの主要プロジェクトがスマートポインタを避けているようですが、なぜスマートポインタが推奨されているのでしょうか?

どのように解決するのですか?

多くのライブラリが標準的なスマートポインタの登場以前に書かれていることを除けば、最大の理由は標準的なC++アプリケーション・バイナリ・インタフェース(ABI)が存在しないことでしょう。

ヘッダのみのライブラリを書くのであれば、スマートポインタや標準コンテナを思う存分まわすことができる。これらのソースはコンパイル時にライブラリで利用できるため、実装ではなくインターフェイスの安定性だけに依存することになります。

しかし、標準的なABIがないため、一般的に できない は、モジュールの境界を越えて安全にこれらのオブジェクトを渡すことができます。GCC shared_ptr は、おそらくMSVCの shared_ptr とは異なる場合があります。 shared_ptr . また 同じく コンパイラを使用した場合、これらのクラスはバージョン間のバイナリ互換性が保証されません。

要するに、もしあなたが プリビルド バージョンのライブラリの場合、依存する標準的なABIが必要です。C言語にはありませんが、コンパイラベンダーは、特定のプラットフォームにおけるC言語ライブラリ間の相互運用性に非常に優れており、事実上の標準が存在するのです。

C++の場合は、状況はそれほどよくありません。個々のコンパイラはそれ自身のバイナリ間の相互運用を扱うことができますから、サポートされているすべてのコンパイラ、多くはGCCとMSVCのためのバージョンを配布するオプションがあります。しかし、この点を考慮すると、ほとんどのライブラリはC言語のインターフェイスをエクスポートするだけで、それは生のポインタを意味します。

しかし、ライブラリ以外のコードでは、一般的に生ポインタよりもスマートポインタを好むはずです。