https://www.geeksforgeeks.org/auto_ptr-unique_ptr-shared_ptr-weak_ptr-2/
#include <memory>
#include <iostream>
class A
{
public:
void show(void)
{
std::cout << "A::show()" <<std::endl;
}
};
std::auto_ptr<A> auto_ptr_test(void)
{
//auto_ptr to type A
std::auto_ptr<A> p1(new A);
p1->show();
std::cout << "p1 address: " << p1.get() << std::endl;
//copy p1 to p2
std::auto_ptr<A> p2(p1);
p2->show();
std::cout << "owner ship changed, P1 address: " << p1.get() << std::endl; //0 (nullptr)
std::cout << "owner ship changed, P2 address: " << p2.get() << std::endl;
// p2.release();
// std::cout << "P2 address after release: " << p2.get() << std::endl; //0 (nullptr)
return p2;
}
std::unique_ptr<A> unique_ptr_test(void )
{
std::unique_ptr<A> p1(new A);
p1->show();
//returns the memory address of p1
std::cout << "p1 address: " << p1.get() << std::endl;
//transfer ownership to p2
std::unique_ptr<A> p2 = std::move(p1);
p2->show();
std::cout << "p1 address: " << p1.get() << std::endl;
std::cout << "p2 address: " << p2.get() << std::endl;
//transfer owner ship to p3
std::unique_ptr<A> p3 = std::move(p2);
p3->show();
std::cout << "p1 address: " << p1.get() << std::endl;
std::cout << "p2 address: " << p2.get() << std::endl;
std::cout << "p3 holds the ownership now, p3 address: " << p3.get() << std::endl;
return p3;
// return std::move(p3);
}
std::shared_ptr<A> shared_ptr_test(void)
{
std::shared_ptr<A> p1(new A);
std::cout << "p1 address" << p1.get() << std::endl;
p1->show();
std::shared_ptr<A> p2(p1); //copy
p2->show();
std::cout << "p1 address: " << p1.get() << std::endl;
std::cout << "p2 address: " << p2.get() << std::endl;
std::cout << "p1.use_count: " << p1.use_count() << std::endl;
std::cout << "p2.use_count: " << p2.use_count() << std::endl;
p1.reset();
std::cout << "p1.address: " << p1.get() << std::endl;
std::cout << "p2.use_count:" << p2.use_count() << std::endl;
std::cout << "p2 address: " << p2.get() << std::endl;
return p2;
}
#if 0
//需要unique_ptr作为返回值时
unique_ptr<A> fun()
{
unique_ptr<A> ptr(new A);
/* ...
... */
return ptr;
}
#endif
int main(void)
{
std::cout << "********auto_ptr test********" << std::endl;
std::auto_ptr<A> a_ptr= auto_ptr_test();
a_ptr->show(); //object of A that newed in auto_ptr_test() still not released, owner ship transfer to a_ptr now
std::cout << "a_ptr address: " << a_ptr.get() << std::endl;
std::cout << "\n\n\n\n";
std::cout << "********unique_ptr test********" << std::endl;
// std::unique_ptr<A> = unique_ptr_test(); //error,unique_ptr can't be copy!!!
std::unique_ptr<A> uq_ptr= std::move(unique_ptr_test());
uq_ptr->show();
std::cout << "uq_ptr address: " << uq_ptr.get() << std::endl;
uq_ptr.release();
std::cout << "uq_ptr address after released: " << uq_ptr.get() << std::endl;
std::cout << "\n\n\n\n";
std::cout << "********shared_ptr test********" << std::endl;
std::shared_ptr<A> sh_ptr = shared_ptr_test();
sh_ptr->show();
std::cout << "sh_ptr address: " << sh_ptr.get() << std::endl;
std::cout << "sh_ptr.use_cout: " << sh_ptr.use_count() << std::endl;
return 0;
}
weak_ptr:
为了解决shared_ptr的循环引用问题,将shared_ptr赋值给weak_ptr的时候不会增加shared_ptr指针的引用计数。
具体可见:
https://blog.csdn.net/albertsh/article/details/82286999
关于pop和shared_ptr的理解:
#include <iostream>
#include <queue>
#include <memory>
std::shared_ptr<int> test()
{
std::queue<int> que;
for(int i=0; i<5; i++)
{
que.push(i+10);
}
std::cout << "que.size: " << que.size() << std::endl;
std::shared_ptr<int> sh_ptr(std::make_shared<int>(que.front()));
std::cout << "get data before pip: " << *sh_ptr << std::endl;
que.pop(); //pop之后元素仍然没有被释放,只是不在这个queue里面了
std::cout << sh_ptr.get() << std::endl;
std::cout << "get data after pop: " << *sh_ptr << std::endl;
std::cout << "que.size after pop: " << que.size() <<std::endl;
return sh_ptr;
}
int main()
{
std::shared_ptr<int> ptr = test();
//即使que已经被销毁,仍然保留了之前share_ptr对应元素的ownership
std::cout << "get data after queue destroyed: " << *ptr << std::endl;
return 0;
}