autoptrスマートポインタ使用まとめ

2503 ワード

まとめ:
  1)aut_ptrは定数としてしか保護できないので、bookライブラリのscoped_を使用することを提案します.ptrで十分です.aut_は使用しないでください.ptrは、赋価及び容器管理を行う.
  2)スマートポインターを付与する必要がある\関数伝達\容器管理\オブジェクト配列ポインタの種類の操作については、bookのshared_を使用します.ptrは、参照カウントを使用しているので、
そうでないとaut_を使いますptrはautにしか対応できませんptrの引用やアドレス操作が安全です.
アートを使うptr注意すべき点:
 1.2つのスマートポインタが同じオブジェクトを指してはいけません.そうでないと削除の際に削除されます.
 2.スマートポインタの値付け操作を行わないでください.そうでなければ、所有権は転送されます.
 3.関数間伝達は、関数パラメータであれ、リターン値であれ、スマートポインタを使用してはいけません.必ずスマートポインタでのみ参照またはアドレスを使用してください.使用する時は、pThreeAutoAにも&記号がありますので、伝達には十分注意してください.
4.配列を指し、スマートポインタをリリースする時はdeleteにdelete[]がないだけで、劣性の深刻なメモリが漏れてしまいます.
5.STL容器管理指針はいけませんが、スマートフォンのアドレスを管理することは可能です.しかし、途中でスマートフォンを変えてしまうと悲劇的になります.
テストコード:
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class A
{
public:
 void SetNum(int num)
 {
  m_nNum = num;
 }
 void Display()
 {
  cout<<"m_nNum value:"<<m_nNum<<endl;
 }
private:
 int m_nNum;
};

//       ,                     
const auto_ptr<A>& TransferAutoPtrByReference(const auto_ptr<A> &p)
{
 return p;
}

const auto_ptr<A>* TransferAutoPtrByPtr(const auto_ptr<A> *p)
{
 return p;
}


int main()  
{  
 A *pObj = new A;
 auto_ptr<A> pAutoA(pObj);
 //auto_ptr<A> pAutoA2(pObj); // 1.    ,                         
 pAutoA->SetNum(10);
 pAutoA->Display();

 auto_ptr<A> pSecondAutoA = pAutoA; // 2.        ,          ,    pAutoA        
 /*if(pAutoA._Myptr == NULL) // pAutoA._Myptr           ,pAutoA    
 {
  pAutoA->SetNum(100);
  pAutoA->Display();
 }*/
 pSecondAutoA->Display();
 const auto_ptr<A> &pThreeAutoA = TransferAutoPtrByReference(pSecondAutoA);// 3.      pThreeAutoA   &   ,       
 pSecondAutoA->Display();
 pThreeAutoA->Display();

 const auto_ptr<A> *pFourAutoA = TransferAutoPtrByPtr(&pSecondAutoA);//       pFourAutoA        ,       
 pSecondAutoA->Display();
 (*pFourAutoA)->Display();

 A *pArrayA = new A[10];
 auto_ptr<A> pArrayAutoPtr(pArrayA);// 4.    ,           delete  delete[],            
 pArrayAutoPtr->SetNum(1);
 pArrayAutoPtr->Display();

 vector<auto_ptr<A>*> vecPtrA;// 5.STL           ,               ,                  
 vecPtrA.push_back(&pSecondAutoA);
 vector<auto_ptr<A>*>::iterator itrA = vecPtrA.begin();
 for(; itrA != vecPtrA.end(); ++itrA)
 {
  (*(*itrA))->SetNum(999);
  (*(*itrA))->Display();
 }
}