auto_ptr, unique_ptr, shared_ptr的使用

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值