首页 > 编程语言 >C++ primer 智能指针的陷阱

C++ primer 智能指针的陷阱

时间:2023-03-07 16:24:22浏览次数:42  
标签:指向 sp1 sp2 C++ 智能 primer 资源 指针

1.不使用相同的内置指针值初始化(或 reset)多个智能指针

有一个现成的约定是当我们将一个原生指针交给(具有资源所有权的)智能指针的时候,这个智能指针被允许认为自己暂时获得了这个原生指针指向资源的独占所有权。对于std::shared_ptr,分享所有权虽然是其功能之一,但如果它即将指向的资源所有权已经有人占据了,你必须让它知道资源已经被谁占了。
 1 int* p = new int();
 2 std::shared_ptr<int> sp1(p);    //sp1认为自己独占了p指向的资源。
 3 std::shared_ptr<int> sp2(sp1);  //sp2初始化自一个智能指针而非原
 4                                 //生指针,其与sp1达成共识,共享
 5                                 //了p指向的资源
 6 std::shared_ptr<int> sp3(p);    //sp3认为自己独占了p指向的资源,
 7                                 //但sp1和sp2还没答应共享给它
 8 //作用域结束时,sp1、sp2和sp3指向的是同一资源,应当只销毁一次;但
 9 //sp1和sp2不知道sp3宣称占了资源,sp3也不知道sp1和sp2宣称占了资源,
10 //结果该资源就会被销毁两次。多次销毁同一个资源是未定义行为。

2.

不应该 delete get()返回的指针;

不使用 get()的返回值去初始化或 reset 另一个智能指针;

当最后一个对应的智能指针被销毁时,get()返回的指针就无效了;

 

get() 返回的原始指针只应该有一种用途,用来作为参数传递给遗留接口;其返回的内置指针,指向智能指针管理的对象,只是为一种情况设计,即需要向不需要智能指针的代码传递一个内置指针

所以不能delete返回的内置指针,这样会导致智能指针所指向的内存释放,智能指针空悬

不能用返回的内置指针去初始化或 reset 另一个智能指针,和1是一个道理,不要用内置指针去多个初始化智能指针

3.

如果使用智能指针管理资源而不是内存,应当定义自定义删除器;

 

4.

如果将 shared_ptr 存放到容器中,之后不再需要其中的部分元素,应当调用 erase 将它们删除,不然这些元素的生命周期会被意外地延长。

 

标签:指向,sp1,sp2,C++,智能,primer,资源,指针
From: https://www.cnblogs.com/lihaoxiang/p/17188462.html

相关文章

  • 【双指针】LeetCode 88. 合并两个有序数组
    题目链接88.合并两个有序数组思路看到题目的第一感觉就是用双指针进行原地合并,但是nums1的元素都在数组头部,如果正序合并的话非常容易破坏nums1的结构。nums1在......
  • C++中的静态多态和动态多态
    今天学习C++时,发现C++中存在静态多态和动态多态静态多态=>也称为编译期多态=>基于模板编程的静态多态动态多态=>也称为运行期多态 =>面向对象的动态多态,它基......
  • 指针与函数
    指针变量作为函数的参数如果想再函数内部修改外部变量的值,需要将外部变量的地址传递给函数  函数内部想要操作(读或写)外部数组元素,将数组名传递给函数  ......
  • 指针8道笔试题解析
    笔试题1:intmain(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));return0;}//程序的结果是什么?第一......
  • 指针数组和数组指针
    普通数组:intarr[5];//数组arr中存放了5个整型数intintintintintarr[0]arr[1]arr[2]arr[3]arr[4]   指针数组:是一个数组,里面存放的是指针......
  • 06、C++指针常量与常量指针
    constint*a;//指向常量int的指针int*consta;//指向int的常量指针,指针是常量voidf1(int*consta){//指针是常量std::cout<<*a<<std::endl;}voidf......
  • 02、C++字符串编码转换
    //string<——>wstring#include<codecvt>std::stringwstring2utf8string(conststd::wstring&str){staticstd::wstring_convert<std::codecvt_utf8<wchar_t>......
  • Dev-C++自带小游戏Jackpot改进
    1.项目简介这是Dev-C++自带的小游戏Jackpot,本质上是一个靠运气和一点点逻辑推理的猜字游戏2.源代码打开Dev-C++,点击左上方的“文件”,再点击“新建”,接着点击“项目”,出......
  • 使用番茄助手(Visual Assist Options)给C++函数自动添加注释
    1、安装并配置番茄助手(VisualAssistOptions)2、使用找到一个c++函数头,通常在头文件.h中,右键对应函数的名字,选择:QuickActionsandRefactorings(VA) --DocumentMe......
  • 智能指针的相关问题
    智能指针是C++11的新特性,包括共享指针、独占指针、弱指针,其主要目的是智能管理内存,防止内存泄漏。如果计数为0,会立即delete。此外,独占指针其生命周期只在函数体内。//动......