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 将它们删除,不然这些元素的生命周期会被意外地延长。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理