ホームページ > バックエンド開発 > C++ > C++ でスマート ポインターを探索する

C++ でスマート ポインターを探索する

王林
リリース: 2023-08-22 15:57:29
オリジナル
620 人が閲覧しました

C++ でスマート ポインターを探索する

スマート ポインタ (スマート ポインタ) は、C における非常に重要な概念です。その役割は、プログラマがメモリ リークを防ぐのを支援することですが、同時に、より便利で柔軟なメモリも提供します。管理。この記事では、スマート ポインターの概念、種類、使用法について詳しく説明します。

  1. スマート ポインターの概念

スマート ポインターは、メモリ割り当てをカプセル化してスマート ポインター オブジェクトに解放するポインターを格納する、最新の C メモリ管理テクノロジです。 C 言語はプログラマのためにメモリを自動的に管理せず、プログラマはメモリの解放を忘れることが多いため、スマート ポインタを使用すると、これらの問題が発生する可能性を大幅に減らすことができます。

スマート ポインタのもう 1 つの利点は、メモリ解放とオブジェクトのライフサイクル管理をプログラマからスマート ポインタ ライブラリに転送するため、プログラムの保守性を向上できることです。最新の C では、スマート ポインターを使用するコードは、生のポインターを使用するコードよりも堅牢でエラーが発生しにくい傾向があります。

  1. スマート ポインターの種類

C には、unique_ptr、shared_ptr、weak_ptr の 3 種類のスマート ポインターがあります。これらはすべて 標準ヘッダー ファイルで定義されており、すべてテンプレート クラスです。

(1)unique_ptr

unique_ptr は排他的なポインターであり、常に 1 つのスマート ポインターだけがオブジェクトをポイントできるようにします。つまり、 unique_ptr は、同じオブジェクトを指す複数のポインターを禁止します。 unique_ptr ポインターを別のスマート ポインターに転送する場合は、std::move() 関数を使用する必要があります。

以下は、 unique_ptr の基本的な使用法を示すサンプル コードです。

std::unique_ptr<int> up(new int(10)); // 声明unique_ptr指针,并分配一个int类型的动态内存区域
std::cout << *up << std::endl; // 输出10
*up = 20; // 修改动态内存中的值
std::cout << *up << std::endl; // 输出20
ログイン後にコピー

unique_ptr ポインターがそのスコープを離れると、それが指す動的メモリが自動的に解放されることに注意してください。 。 (例外がスローされた場合でも)

(2)shared_ptr

shared_ptr は複数のポインタで同じオブジェクトを共有でき、use_count() 関数を使用してポインタの数を取得できます。同じオブジェクトを指しています。複数のポインタが同じオブジェクトを指す可能性があるため、メモリ リークにつながる可能性のある循環参照の状況を避けるように注意する必要があります。

サンプル コードは次のように使用します。

std::shared_ptr<int> sp1(new int(10));
std::shared_ptr<int> sp2 = sp1;
std::cout << *sp1 << std::endl; // 输出10
std::cout << *sp2 << std::endl; // 输出10
std::cout << sp1.use_count() << std::endl; // 输出2
ログイン後にコピー

新しいshared_ptrポインタが同じメモリ領域を指すたびに、メモリ領域の参照カウントが1ずつ増加することに注意してください。同様に、ポインターがそのスコープを離れると、それに応じて参照カウントがデクリメントされます。メモリは参照カウントが 0 に達した場合にのみ解放されます。 (例外がスローされた場合でも)

(3)weak_ptr

weak_ptr は、shared_ptr のより軽量なバージョンです。指すオブジェクトを制御できないため、使用する前にshared_ptrに変換する必要があります。参照カウントには影響しないため、メモリ リークは発生しません。ただし、weak_ptr を使用する場合は、指定されたオブジェクトが存在することを確認する必要があることに注意してください。存在しないと、weak_ptr が提供するインターフェイスを使用するとプログラム エラーが発生します。

以下はweak_ptrの使用例です:

std::shared_ptr<int> sp1(new int(10));
std::weak_ptr<int> wp = sp1;
std::cout << *wp.lock() << std::endl; // 使用weak_ptr提供的lock()函数将其转化为shared_ptr,并访问内存中的值
std::cout << wp.use_count() << std::endl; // 输出1
ログイン後にコピー

ポイントされたオブジェクトが削除されると、weak_ptr.lock()によって返されるshared_ptrは空になることに注意してください。

  1. スマート ポインターの使用

スマート ポインターを使用すると、管理している動的メモリを自動的に解放できるため、メモリ管理のタスクが大幅に簡素化されます。スマート ポインターを使用する場合、動的メモリ割り当ての戻り値に初期化する必要があります。以下は、読者がスマート ポインターの使用をよりよく理解するのに役立つサンプル コードです。

// 使用unique_ptr
std::unique_ptr<int> up(new int(10));
std::unique_ptr<float[]> u_arr( new float[5] ); // 对数组使用unique_ptr
// 使用shared_ptr
std::shared_ptr<int> sp(new int(10));
std::shared_ptr<double> sp_arr(new double[5], [](double* p){ delete[] p; }); // 对数组使用shared_ptr,并在内部传递匿名的lambda表达式释放动态内存
std::shared_ptr<Base> spb = std::make_shared<Base>(); // 使用std::make_shared创建shared_ptr指针
std::shared_ptr<Derived> spd = std::make_shared<Derived>(); 
// 使用weak_ptr
std::weak_ptr<int> wp;

if (auto sp = wp.lock()) // 使用wp.lock()检查指向的对象
{
    // 操作所指向的对象
}
else
{
    // 找不到所指向的对象
}
ログイン後にコピー

通常のポインタとスマート ポインタが同じ動的メモリを指すために使用されている場合、スマート ポインタは通常のポインタより先に破棄され、通常のポインタが簡単にポイントする可能性があることに注意してください。解放された(使用されているメモリ領域を解放できません)。

  1. 概要

スマート ポインタは、メモリ リークをある程度防ぎ、プログラムのパフォーマンスを向上させる非常に便利な C メモリ管理方法です。 C++11 以降の標準では、メモリ管理の推奨方法としてスマート ポインターが推奨されています。実際の開発プロセスでは、最適なメモリ管理効果を達成するために、特定の状況に応じてどのタイプのスマート ポインタを使用するかを選択する必要があります。

以上がC++ でスマート ポインターを探索するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート