から取得中に共有ポインタがstd::vector
のiterator
デリファレンスを使用して印刷されたときに以下の予想外use_count()
値を出力しているプログラム:予期しない値()のshared_ptrのベクトル
#include<iostream>
#include<memory>
#include<vector>
class A;
typedef std::shared_ptr<A> sharedPtr;
typedef std::vector<sharedPtr> sharedPtrVect;
typedef sharedPtrVect::const_iterator vectItr;
class A
{
public:
A(int inp): m_Val(inp) { /*std::cout << "*** A ctor called: " << m_Val << " ***" <<std::endl;*/ }
~A() { /*std::cout << "### A dtor called: " << m_Val << " ###" <<std::endl; */}
int getVal() const { return m_Val; }
private:
int m_Val;
};
int main()
{
sharedPtrVect myVect1, myVect2;
vectItr myVectItr;
std::shared_ptr<A> tmpPtr;
for(int i = 1 ; i <= 5 ; i++) {
std::cout << "Pushed back: " << i << std::endl;
tmpPtr = std::make_shared<A>(i);
myVect1.push_back(tmpPtr);
}
myVectItr = myVect1.begin();
for( ; myVectItr != myVect1.end() ; ++myVectItr) {
std::cout << "-----------------------------" << std::endl;
std::cout << "Element number: " << (*myVectItr).get()->getVal() << std::endl;
std::cout << "Element use count: " << (*myVectItr).use_count() << std::endl;
std::cout << "-----------------------------" << std::endl;
}
return 0;
}
上記のコードの出力次のとおりです。
Pushed back: 1
Pushed back: 2
Pushed back: 3
Pushed back: 4
Pushed back: 5
-----------------------------
Element number: 1
Element use count: 1
-----------------------------
-----------------------------
Element number: 2
Element use count: 1
-----------------------------
-----------------------------
Element number: 3
Element use count: 1
-----------------------------
-----------------------------
Element number: 4
Element use count: 1
-----------------------------
-----------------------------
Element number: 5
Element use count: 2 //I am not sure why or how this is 2?
-----------------------------
私は最後のベクトル要素のためuse_count()
がどのように理解していない2.それは他の人のように1ではないでしょうか?私はベクトルの最後の要素に格納されている共有ポインタのコピーを作成していません。 私はここで何が欠けていますか?
編集:私はC++ 98で良い経験をしていますが、C++ 11では経験が少ないです。
また、良いコーディングスタイルとして、 'tmpPtr'はループの中で宣言されるべきです、なぜならそれはそれが使用される唯一の場所だからです。 – SirGuy
@SirGuyはい、可能な限り狭い範囲で宣言します。あなたが何も存在する必要がないと宣言している場合を除きます。 :Pとにかく、何かに必要なものがあれば、 'auto'で宣言して、RHSの' make_shared'式から推論する方が簡単です。 –
詳細な説明のために@underscore_dをありがとうございます。今あなたの説明の後、私は自分自身でこれを持っているはずです!しかし、詳細はすべてです。それはC++の美しさです、私は信じています:) – Upayan