• C++标准库(第二版,作者_NicolaiMJosuttis)_第5章通用工具5.2.1shared_ptr


    用过shared_ptr 的不用那么牛叉,http协议居然还分Windows 和Linux,某公司的技术总监我也是服了。还有所谓的研发部经理,你们公司作为20多年的小公司,研发出来啥啦?还大嘴巴一张“JSON”你难道还不知道吗?我心说你“是不是傻叉,牛逼个啥!”

    没有用过的看过来,这个入门非常好。

    1. // sharedptr1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. int main()
    9. {
    10. //two shared pointers representing two persons by their name
    11. shared_ptr pNico(new string("nico"));
    12. shared_ptr pJutta(new string("jutta"));
    13. //初始化的时候也可以使用 便捷函数 make_shared()
    14. shared_ptr pNico2 = make_shared("noco2");
    15. shared_ptr pJutta2 = make_shared("jutta2");
    16. //初始化的时候也可以使用 reset():
    17. shared_ptr pNico4;
    18. // pNico4 = new string("Nico4");//这么写就错了
    19. pNico4.reset(new string("Nico4"));//OK
    20. //capital person names
    21. // (*pNico)[0] = 'N';// this line code it does not work so ,do it like pJutta
    22. pNico->replace(0, 1, "N");
    23. pJutta->replace(0,1,"J");//将开始处:0 一直到结束处:1 替换为 J 说白了就是替换了首字符
    24. //put them multiple times in a container
    25. vector> whoMadeCoffee;
    26. whoMadeCoffee.push_back(pJutta);
    27. whoMadeCoffee.push_back(pJutta);
    28. whoMadeCoffee.push_back(pNico);
    29. whoMadeCoffee.push_back(pJutta);
    30. whoMadeCoffee.push_back(pNico);
    31. //print
    32. for (auto ptr: whoMadeCoffee)
    33. {
    34. cout << *ptr <<" ";
    35. }
    36. cout << endl;
    37. //overwirte a name again
    38. *pNico = "NicolaisZhaoSi";
    39. cout << "***After Overwrit***" << endl;
    40. //print again
    41. for (auto ptr : whoMadeCoffee)
    42. {
    43. cout << *ptr <<" ";
    44. }
    45. cout << endl;
    46. //print some internal data
    47. cout << "use_count of pJutta:" << whoMadeCoffee[0].use_count() << endl;
    48. cout << "use_count of pJutta:" << whoMadeCoffee[2].use_count() << endl;
    49. }

    程序解释:shared_ptr 可以共享(或者说拥有)同一对象。对象的最后一个拥有者有责任销毁对象,并清理与该对象相关的所有资源。

    总之,shared_ptr的目标就是在其所指向的对象不再被需要之后,自动释放与对象相关的资源。

    可以像使用任何其他pointer一样地使用shared_ptr。可以赋值、拷贝、比较他们。下面解释一下上面程序的要点:

    #include 需要包含这个文件。

    声明和赋初值的时候有三种写法,{}、reset()、make_shared() 都可以,哪种都可以。

    但凡是容器,总是为传入的元素创建属于容器自己的拷贝,所以如果我们直接插入string,插入的其实是string 的拷贝。我们放进去的是一个poiner to string ,因此被复制的也是那些pointer ,于是容器内含有多个“指向同一对象”的reference。这意味着如果我们改动对象,该容器内的所有身影(occurrence)都会被改动。

    use_count()会返回某个shared_ptr所指对象的当前拥有者的数量。

    运行结果如下:

    1. Jutta Jutta Nico Jutta Nico
    2. ***After Overwrit***
    3. Jutta Jutta NicolaisZhaoSi Jutta NicolaisZhaoSi
    4. use_count of pJutta:4
    5. use_count of pJutta:3

  • 相关阅读:
    mac 本地搭建go-admin之vue打包(二)
    JAVA 相关书籍推荐(全)
    制造业企业设备管理常见的三个问题及对应的解决方案
    LeetCode 26. 删除有序数组中的重复项 简单
    刷题笔记day01-数组
    『忘了再学』Shell基础 — 16、位置参数变量
    量化:概率统计基础
    3000字教你如何加快Spring Boot启动
    安利几个小技巧教会你ppt如何转pdf
    maven创建web项目—war
  • 原文地址:https://blog.csdn.net/superfreak/article/details/127823125