C++スマートポインタshared_ptr、unique_ptrとweak_ptr

2597 ワード

  • 引用:
  • C++では、ダイナミックメモリがよく使用され、一般的にnew申請がよく使用され、deleteが解放されます.
    よくある3つのケースは、次のとおりです.
  • プログラムは自分がどれだけのオブジェクトを使用する必要があるか分からない
  • プログラムは必要なオブジェクトの正確なタイプを知らない
  • プログラムは、複数のオブジェクト間でデータを共有する必要がある(出願の動的メモリは、ポインタの役割ドメインの終了に伴って自動的に解放されない)
  • .
    newは3つのステップに分けて実行されます:1.mallocを呼び出して動的メモリを申請します;2.入力タイプのコンストラクション関数を呼び出す.3.異常がないか判断して投げ出す.deleteの原理は似ている
    例:
    int *p1=new int(3);//        (int 4  ),   3
    int *p2=new int[10];//       10       。*p ,*(p+1) ,*(p+2),...*(p+9)    

    ダイナミックメモリを解放するには手動deleteが必要で、異常を防ぐためにポインタを空nullptrにしたほうがいいです.
    delete p1;//   p1       
    p1=nullptr;
    delete [] p2;//               []
    p2=nullptr;

    でも!プログラマーがうっかり申請したり、手動で解放しないことを忘れたりすると、プログラム内のメモリが多くなり、メモリの漏洩の問題が発生します.申請後にメモリを自動的に解放してくれるスマートなポインタがあれば便利なのではないでしょうか.スマートポインタの概念も導入されています.
  • 本文
  • vectorのようなSTLコンテナでは、スマートポインタもテンプレートなので、スマートポインタを使用するときにタイプを指定する必要があります.
    shared_ptr
    (一夫多妻制)
    複数のポインタが同じアドレスを指すことを許可します.shared、共有しますか.メモリを申請すると、ブロックメモリに参照カウントが設定され、メモリを指すポインタが新たに1つ増えるたびにカウント+1がカウントされ、ポインタが役割ドメインから離れて期限が切れた後にカウント-1がカウントされ、参照カウントが0の場合、メモリが本当に不要であることを示し、自動的に解放されます.
    ダイナミックメモリを申請する方法は2つあります.
    shared_ptr p1=make_shared(5);
    
    shared_ptr p2(new int(5));

    でもshared_ptr p2=new int(5);これは構造関数の明示的な呼び出しと暗黙的な概念について、興味のある学生が理解します.
     
    では、所有権を共有する操作は次のとおりです.
    shared_ptr p3(p1);
    
    shared_ptr p4;
    p4=p1;

    unique_ptr
    (一夫一妻制)
    ある時点で、ある時点でuniqueが1つしかないことに注意してください.ptrはメモリを指します.離婚してから結婚しても大丈夫ですが、離れていないうちに結婚したいですか.すみません、ルールでは許されません.
    ダイナミックメモリを申請する方法は1つだけです.
    unique_ptr p1(new int(5));

     
    所有権を譲渡する操作は以下の通りです.
    unique_ptr p2(p1.release());

    p 1はメモリの所有権をp 2に与えたが、p 1はその前にreleaseが先に手を放す必要がある(強くねじった瓜は喉が渇いても甘くない)、releaseはuniqueを切断するptrと元の管理メモリとのつながりは、ポインタを返します.
    unique_ptr p3(new int(10));
    p3.reset(p2.release());

    reset()パラメータがある場合、p 3はp 2に対応するメモリを指す.パラメータがない場合は、p 3を空にします.
    weak_ptr
    (夫がいるか確認)
    shared_とptrを組み合わせて使用します.sharedを手に入れた時ptrのポインタでは、対応するダイナミックメモリがあるかどうかは判断できません.その間に自動的に解放される可能性があります.weak_ptrは運に応じて生まれた.彼女はsharedにバインドされたptrではshared_は変わりませんptrの参照カウントは、カウントが0の場合、weak_があってもptrはオブジェクトを指し、オブジェクトは解放されます.
    バインド:
    shared_ptr p1(new int(5));
    weak_ptr wp1(p1);//    

    判断操作では関数lock()が使用されます    メモリが空でない場合は、メモリに対応するshared_を返します.ptr,逆に空に戻るshared_ptr
    if(shared_ptr ptmp=wp1.lock())//            
    {...}