Boost 開発ガイド - 3.12 概要

メモリ管理は C++ プログラム開発における永遠のテーマです。ガベージ コレクション メカニズムがないため、メモリやその他のシステム リソースを注意深く管理することは、すべての C++ プログラマが直面しなければならない問題です。C++11 標準では、プログラマーのメモリ管理の負担を大幅に軽減する unique_ptr、shared_ptr、およびweak_ptr が提供されていますが、すべての問題が解決されるわけではありません。メモリ管理に関する Boost の 2 つのライブラリ、smart_ptr と pool について説明します。

boost.smart_ptr ライブラリは、C++11 標準の定義に非常に近い、いくつかの新しいタイプのスマート ポインターを提供します。これにより、new と l delete の明示的な使用が効果的に排除され、コード リソース リークが削減または排除されます。
scoped_ptr は、smart_ptr ライブラリで最も学習し、使用するのが簡単です。unique_ptr と同様に動作しますが、所有権はより明確です。この種のスマート ポインタは、宣言されたスコープ内でのみ使用でき、転送できないことが明確に示されています。そのコピーはすべて、試みは失敗します。この機能は、後でコードをメンテナンスする場合に非常に役立ちます。

shared_ptr はおそらく最も便利なスマート ポインターであり、これらのスマート ポインターの中で最も「スマート」でもあり、メモリだけでなく他のシステム リソースも管理でき、さまざまな状況で使用できます。ポインタの参照カウントを自動的に計算でき、その動作は元のポインタに最も近くなります。Shared_ptr は、リソース リークの危険を冒さずに、生のポインタを使用できるほぼどこでも使用できますShared _ptr はポインターを保存するだけでなく、デリーターを構成することでポインターに関連付けられたリソースを自動的に解放することもできます。基本的な使用法に加えて、pimpl イディオムの実装、ファクトリ パターンへの適用、エイリアス構築、任意のオブジェクトへのポインタの保持など、shared_ptr の他の多くの使用法についても説明しました。これらの使用法は、その強力な機能をさらに実証します。

スマート ポインターの使用を容易にするために、smart_ptr ライブラリにはファクトリー関数 make_unique() および make_shared() も提供されており、これによりコード内での new 演算子の使用がさらに排除されます。

scoped_array/shared_array は、scoped_ptr/shared_ptr を動的配列に拡張したもので、自動的に削除できる動的配列のエージェントを提供します。また、shared_array には、scoped_array よりも多くの用途があります。ただし、shared_ptr<vector>プログラムに非常に厳しいパフォーマンス要件がない限り、ベクトル合計を使用する必要があります。

また、smart_ptr の他の 2 つのグループについても簡単に説明します。weak_ptr は、参照カウントに影響を与えることなく共有 ptr を「静的に」観察できる弱参照であり、intrusive_ptr は、自己実装の参照カウント スマート ポインタのための一般的な技術ソリューションを提供します。

プール ライブラリは、メモリ管理の点で Boost ライブラリが提供するもう 1 つの便利なツールで、メモリ リソースを管理するための効率的なメモリ プールを実装します。プール ライブラリは、さまざまな状況のアプリケーションに適した、pool、object_pool、singleton_pool、pool_alloc の 4 種類のメモリ プールを提供します。これらは完全に小さなガベージ コレクション メカニズムと見なすことができ、リサイクルをまったく気にすることなく、また元のクラスに何らかの変更を加えることなく、オブジェクトを自由にメモリ プール内に動的に作成できます。

プール ライブラリの 4 つのメモリ プール クラスのうち最初の 3 つは非常に便利で、特にobject_pool はさまざまなオブジェクトの作成と破棄を均一に管理でき、さまざまな規模のオブジェクト指向ソフトウェア システムに適切に適用できます。pool_alloc に関しては、C++ 標準に準拠した高速かつ効率的なメモリ アロケーターの実装ですが、通常は標準ライブラリに付属するメモリ アロケーターの方がコンテナーでより適切に動作するため、使用する場合は考えられる影響を慎重に評価する必要があります。 pool_alloc 。

プール ライブラリは、低レベル実装クラス simple_segregated_storage も提供します。これは、単純な分離ストレージの管理メカニズムを実装し、プール ライブラリ内の他のクラスの基礎となります。これはほとんどのライブラリ ユーザーには適していませんが、メモリ プール クラスを自分で実装する場合には良い出発点となります。

おすすめ

転載: blog.csdn.net/qq_36314864/article/details/132067725