ホームページ  >  記事  >  バックエンド開発  >  C++ スマート ポインター: ライフサイクルの包括的な分析

C++ スマート ポインター: ライフサイクルの包括的な分析

WBOY
WBOYオリジナル
2024-05-09 11:06:02735ブラウズ

C++ スマート ポインターのライフ サイクル: 作成: メモリが割り当てられたときにスマート ポインターを作成します。所有権の譲渡: 移動操作を通じて所有権を譲渡します。リリース: スマート ポインターがスコープ外に出るか、明示的に解放されると、メモリが解放されます。オブジェクトの破壊: ポイントされたオブジェクトが破壊されると、スマート ポインターは無効なポインターになります。

C++ 智能指针:全面剖析其生命周期

C++ スマート ポインター: ライフ サイクルの包括的な分析

はじめに

スマート ポインターは、動的に割り当てられたメモリを管理するために使用される C++ の特別なポインターです。生のポインタとは異なり、スマート ポインタは、それが指すオブジェクトのメモリ状態を追跡し、オブジェクトが不要になったときにそのメモリを自動的に解放する責任があります。これは、メモリ リークやダングリング ポインタなどの一般的なプログラミング エラーを防ぐのに役立ちます。

タイプ

C++ 標準ライブラリは、スマート ポインターの 4 つの主要なタイプを提供します:

  • unique_ptr8742468051c85b06f0a0af9e3e506b5c: 一意に所有されるポインター。オブジェクトを指すことができるのは、一度に 1 つの unique_ptr だけです。
  • shared_ptr8742468051c85b06f0a0af9e3e506b5c: 共有所有権へのポインタ。同じオブジェクトを指すshared_ptrが複数存在する場合があります。
  • weak_ptr8742468051c85b06f0a0af9e3e506b5c: 弱参照ポインタ。 weak_ptr はオブジェクトの破棄を妨げないため、shared_ptr と組み合わせて使用​​する必要があります。
  • auto_ptr8742468051c85b06f0a0af9e3e506b5c: 放棄されました。 C++11 では削除されました。

ライフサイクル

1. 作成

生のポインターを使用するのと同じように、オブジェクトがメモリを割り当てるときにスマート ポインターを作成できます:

auto ptr = std::make_unique<int>(42);

2. スマート ポインターは ( move) 操作により所有権が譲渡されます:

auto ptr2 = std::move(ptr);  // ptr2 现在拥有对整数对象的唯一所有权

3. 解放

スマート ポインターがそのスコープを離れるか、明示的に解放されると、所有するメモリが解放されます:

{
    auto ptr = std::make_unique<int>(42);
    // ...
}  // ptr 在此处释放

4. オブジェクトの破壊

オブジェクトが破棄されると、スマート ポインタは無効なポインタになります:

int* ptr = new int(42);
auto sptr = std::make_shared<int>(ptr);
delete ptr;  // ptr 被销毁
sptr->get();  // sptr 现在指向一个无效指针,因此 get() 会抛出异常

実践的な例

スマート ポインタを使用して動的に割り当てられた配列を管理する方法は次のとおりです:

// 原始指针版本
int* arr = new int[10];  // 分配数组

// ...

delete[] arr;  // 释放数组

// 智能指针版本
std::unique_ptr<int[]> arr = std::make_unique<int[]>(10);  // 分配数组

// ...

// arr 在离开范围时自动释放

スマート ポインタ バージョンはメモリを妨げるため、より安全ですリークとぶら下がりポインタ。

以上がC++ スマート ポインター: ライフサイクルの包括的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。