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容器管理指針はいけませんが、スマートフォンのアドレスを管理することは可能です.しかし、途中でスマートフォンを変えてしまうと悲劇的になります.
テストコード:
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();
}
}