C++11/14之STD::SHARED_PTR引用次数详解
注意:
- 注意值参数和构造参数中copy导致引用加1
- 引用参数和move结合,原目标引用次数为0,新目标持有源目标次数
详细比较和分析如下
- c++中使用std::shared_ptr类型做为构造函数参数,并使用std::move()初始化成员变量。
#include <iostream>
#include <utility>
#include <memory>
class Base
{
public:
// 值参数copy增加1, move导致源目标引用次数为0,次数转移为目标持有
Base(std::shared_ptr<int> a, std::shared_ptr<int> b)
: x{ std::move(a) }
, y{ std::move(b) }
{
std::cout << "a->count=" << a.use_count() << std::endl; // 0
std::cout << "b->count=" << b.use_count() << std::endl; // 0
}
void display()
{
std::cout << "member: x->count=" << x.use_count() << std::endl; //3
std::cout << "member: y->count=" << y.use_count() << std::endl; //2
std::cout << "--------------------------------" << std::endl;
}
private:
std::shared_ptr<int> x;
std::shared_ptr<int> y;
};
int main(void)
{
auto sp1 = std::make_shared<int>(111);
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //1
decltype(sp1) sp2 = sp1;
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //2
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //2
auto sp4 = std::make_shared<int>(444);
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //1
Base b(sp1, sp4);
b.display();
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //3
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //3
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //2
return 0;
}
- c++中使用std::shared_ptr类型做为构造函数参数,并直接初始化成员变量。
#include <iostream>
#include <utility>
#include <memory>
class Base
{
public:
// 值参数copy增加1,构造参数复制增加1,a,b 均增加2
Base(std::shared_ptr<int> a, std::shared_ptr<int> b)
: x{ a }
, y{ b }
{
std::cout << "a->count=" << a.use_count() << std::endl; //4
std::cout << "b->count=" << b.use_count() << std::endl; //3
}
void display()
{
// 构造函数执行完自动释放a,b引用,引用减去1
std::cout << "member: x->count=" << x.use_count() << std::endl; //3
std::cout << "member: y->count=" << y.use_count() << std::endl; //2
std::cout << "--------------------------------" << std::endl;
}
private:
std::shared_ptr<int> x;
std::shared_ptr<int> y;
};
int main(void)
{
auto sp1 = std::make_shared<int>(111);
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //1
decltype(sp1) sp2 = sp1;
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //2
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //2
auto sp4 = std::make_shared<int>(444);
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //1
Base b(sp1, sp4);
b.display();
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //3
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //3
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //2
return 0;
}
- c++中使用std::shared_ptr通过引用的方式做为构造函数参数,并使用std::move()初始化成员变量。
#include <iostream>
#include <utility>
#include <memory>
class Base
{
public:
//引用参数不变,move导致源目标引用次数为0,次数转移为目标持有
Base(std::shared_ptr<int>& a, std::shared_ptr<int>& b)
: x{ std::move(a) }
, y{ std::move(b) }
{
std::cout << "a->count=" << a.use_count() << std::endl; //0
std::cout << "b->count=" << b.use_count() << std::endl; //0
}
void display()
{
std::cout << "member: x->count=" << x.use_count() << std::endl; //2
std::cout << "member: y->count=" << y.use_count() << std::endl; //1
std::cout << "--------------------------------" << std::endl;
}
private:
std::shared_ptr<int> x;
std::shared_ptr<int> y;
};
int main(void)
{
auto sp1 = std::make_shared<int>(111);
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //1
decltype(sp1) sp2 = sp1;
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //2
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //2
auto sp4 = std::make_shared<int>(444);
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //1
Base b(sp1, sp4);
b.display();
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //0
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //2 与x引用同一个参数
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //0
return 0;
}
- c++中使用std::shared_ptr通过引用的方式做为构造函数参数,并直接初始化成员变量。
#include <iostream>
#include <utility>
#include <memory>
class Base
{
public:
//引用 a,b 为sp1和sp4 次数 2,1
Base(std::shared_ptr<int>& a, std::shared_ptr<int>& b)
: x{ a }
, y{ b }
{
//构造x,y 增加 1
std::cout << "a->count=" << a.use_count() << std::endl; //3
std::cout << "b->count=" << b.use_count() << std::endl; //2
}
void display()
{
std::cout << "member: x->count=" << x.use_count() << std::endl; //3
std::cout << "member: y->count=" << y.use_count() << std::endl; //2
std::cout << "--------------------------------" << std::endl;
}
private:
std::shared_ptr<int> x;
std::shared_ptr<int> y;
};
int main(void)
{
auto sp1 = std::make_shared<int>(111);
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //1
decltype(sp1) sp2 = sp1;
std::cout << "sp1->count=" << sp1.use_count() << std::endl; //2
std::cout << "sp2->count=" << sp2.use_count() << std::endl; //2
auto sp4 = std::make_shared<int>(444);
std::cout << "sp4->count=" << sp4.use_count() << std::endl; //1
Base b(sp1, sp4);
b.display();
// x,y 分别对应 sp1 sp4次数一致 3,2
std::cout << "sp1->count=" << sp1.use_count() << std::endl;
std::cout << "sp2->count=" << sp2.use_count() << std::endl;
std::cout << "sp4->count=" << sp4.use_count() << std::endl;
return 0;
}