ホームページ > バックエンド開発 > C++ > C++ スマート ポインター: 基本から高度まで

C++ スマート ポインター: 基本から高度まで

WBOY
リリース: 2024-05-09 21:27:02
オリジナル
893 人が閲覧しました

スマート ポインタは、ヒープ メモリ オブジェクトを自動的に解放し、メモリ エラーを回避できる C++ 固有のポインタです。タイプには以下が含まれます。 unique_ptr: 単一のオブジェクトを指す排他的所有権。 shared_ptr: 共有所有権。複数のポインタがオブジェクトを同時に管理できるようにします。 weak_ptr: 弱い参照。参照カウントを増加させず、循環参照を回避します。使用法: std 名前空間の make_unique、make_shared、make_weak を使用してスマート ポインターを作成します。スマート ポインターは、スコープが終了するとオブジェクト メモリを自動的に解放します。高度な使用法: カスタム デリーターを使用して、オブジェクトの解放方法を制御できます。スマート ポインタは動的配列を効果的に管理し、メモリ リークを防ぐことができます。

C++ 智能指针:从基础到高级

基本から高度まで: C++ スマート ポインター

はじめに

スマート ポインターは、メモリ管理を解決するために設計された C++ の特別なポインターです。ポインタがオブジェクトを指すヒープ メモリ上の領域を自動的に解放することで、メモリ リークやダングリング ポインタなど、手動メモリ管理によって引き起こされる一般的なメモリ エラーを効果的に回避します。

C++ には複数のスマート ポインター型があり、それぞれに独自の機能と用途があります:

  • unique_ptr: 1 つのポインターでのみ管理できるオブジェクトを指す排他的所有権スマート ポインター。
  • shared_ptr: 共有所有権を持つスマート ポインター。複数のポインターが同じオブジェクトを同時に管理できるようにします。
  • weak_ptr: 弱参照スマート ポインター。オブジェクトの参照数は増加せず、循環参照を回避するために使用されます。

基本的な使用法

スマート ポインターを作成するには、std 名前空間内の対応する型テンプレートを使用するだけです: std 命名空间中的相应类型模板:

// 独占所有权
unique_ptr<int> p1 = make_unique<int>(42);

// 共享所有权
shared_ptr<int> p2 = make_shared<int>(10);

// 弱引用
weak_ptr<int> p3 = p2;
ログイン後にコピー

释放内存

智能指针会在其作用域结束时自动释放所指向的对象。因此,不需要手动调用 deletefree

实战案例:动态数组管理

使用智能指针管理动态数组,可以避免因忘记手动释放空间而导致的内存泄漏:

// 普通的动态数组管理
int* arr = new int[100];

// 智能指针管理动态数组
unique_ptr<int[]> arr = make_unique<int[]>(100);
ログイン後にコピー

arr 超出其作用域时,智能指针会自动删除数组。这确保了在所有情况下都释放了资源。

高级用法:自定义删除器

某些情况下,可能需要使用自定义删除器来控制指针指向对象的释放方式。这可以通过重载 delete

class MyObject {
public:
    ~MyObject() {
        // 自定义删除逻辑
    }
};

int main() {
    unique_ptr<MyObject, decltype(&MyObject::delete)> p = make_unique<MyObject>(&MyObject::delete);
}
ログイン後にコピー

メモリを解放します

スマート ポインターはスコープが終了すると自動的に終了します尖ったオブジェクトを放します。したがって、delete または free を手動で呼び出す必要はありません。

🎜実際のケース: 動的配列管理🎜🎜🎜 スマート ポインタを使用して動的配列を管理し、手動でスペースを解放し忘れることによるメモリ リークを回避します: 🎜rrreee🎜 arr がそのスコープを超えると、スマート ポインタが自動的に実行されます配列を削除します。これにより、どのような場合でもリソースが確実に解放されます。 🎜🎜🎜高度な使用法: カスタム デリーター🎜🎜🎜場合によっては、ポインターが指すオブジェクトを解放する方法を制御するためにカスタム デリーターを使用する必要がある場合があります。これは、delete 演算子をオーバーロードすることで実現できます。 🎜rrreee🎜🎜結論🎜🎜🎜 スマート ポインターを C++ コード ベースに組み込むことで、開発者はよくある間違いを回避しながら、メモリ管理の効率を大幅に向上させることができます。これは、より堅牢で信頼性の高いアプリケーションを構築するのに役立ちます。 🎜

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

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