ホームページ  >  記事  >  バックエンド開発  >  C++ スマート ポインター: ポインターの進化、メモリ問題の優れた解決策

C++ スマート ポインター: ポインターの進化、メモリ問題の優れた解決策

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

スマート ポインタは、メモリ解放を自動的に管理することでメモリ管理の問題を解決する C++ のツールです。一般的に使用されるスマート ポインターのタイプは次のとおりです。 unique_ptr: 排他的所有権。破棄されたときにポイントされたオブジェクトを解放します。 shared_ptr: 共有所有権、参照カウントによりポインターの数が追跡され、最後のポインターが破棄されるとオブジェクトが解放されます。 weak_ptr: 弱い参照はオブジェクトのライフサイクルを増加させず、shared_ptr と組み合わせてのみ使用できます。

C++ 智能指针:指针的进化,解决内存问题的良药

C++ スマート ポインタ: ポインタの進化、メモリ問題の優れた解決策

スマート ポインタは、メモリの解放を自動的に管理することでメモリ リークやワイルド ポインタなどの問題の解決に役立つ C++ の強力なツールです。従来のポインターと比較して、スマート ポインターはより安全で効率的であるため、プログラマーはメモリ管理の面倒な詳細を気にせずにビジネス ロジックの作成に集中できます。

複数の共通スマート ポインター

unique_ptr

  • 排他的所有権は、1 つのオブジェクトのみを指します。
  • unique_ptr が破棄されると、それが指すオブジェクトも破棄されます。

shared_ptr

  • 所有権を共有し、複数のオブジェクトが同じメモリブロックを指すことを許可します。
  • 参照カウントはポインターの数を追跡します。最後のshared_ptrが破棄されると、ポイントされたオブジェクトも破棄されます。

weak_ptr

  • 弱参照は、指定されたオブジェクトのライフサイクルを増加させません。
  • shared_ptr と組み合わせてのみ使用できます。最後のshared_ptrが破壊されると、weak_ptrは無効になります。

実際的なケース

人を表す person クラスがあるとします。私たちの目標は、person オブジェクトを格納するベクターを作成し、ベクターがスコープ外になったときにメモリが自動的に解放されるようにすることです。 Person 类,它表示一个人。我们的目标是创建一个存储 Person 对象的向量,并确保当向量超出了作用域时,内存会被自动释放。

#include <iostream>
#include <vector>
#include <memory>

class Person {
public:
    Person(const std::string& name) : name(name) {}
    ~Person() { std::cout << "Destructor called for " << name << std::endl; }

private:
    std::string name;
};

int main() {
    std::vector<std::shared_ptr<Person>> people;

    // 添加几个 Person 对象
    people.push_back(std::make_shared<Person>("John"));
    people.push_back(std::make_shared<Person>("Mary"));
    people.push_back(std::make_shared<Person>("Bob"));

    // 遍历并打印名称
    for (const auto& person : people) {
        std::cout << person->name << std::endl;
    }

    return 0;
}

输出:

John
Mary
Bob
Destructor called for John
Destructor called for Mary
Destructor called for Bob

在示例中,我们使用 std::shared_ptr8abf60ac54173a2785e603c7a1f95b4e 来存储 Person 对象的指针。当 people 向量超出作用域销毁时,智能指针也会随之销毁。这将自动释放 Personrrreee

出力: 🎜rrreee🎜 この例では、std::shared_ptr0833d296851a1e081f2175a4cbfa7135 を使用して、person オブジェクトのポインターを保存します。 people ベクターがスコープ外で破棄されると、スマート ポインターも破棄されます。これにより、person オブジェクトによって占有されていたメモリが自動的に解放され、メモリ リークが防止されます。 🎜

以上がC++ スマート ポインター: ポインターの進化、メモリ問題の優れた解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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