东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1136|回复: 1
打印 上一主题 下一主题

[C/C++] 使用智能指针需要注意的几个“坑”

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14432
QQ
跳转到指定楼层
楼主
发表于 2021-9-16 17:50:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
// 使用智能指针需要注意的几个“坑”:
// 1、绝对不要自己手动的管理资源 不要用new和delete了 malloc() free()了
// 2、一个裸指针不要用2个shared_ptr来管理
// 3、使用weak_ptr来打破循环引用  http://www.ai111.vip/thread-1261-1-1.html
// 4、类的内部接口中,需要将this指针当智能指针使用时,需要继承enable_shared_from_this<类名> 注意shared_from_this()不能在构造析构中使用
// 5、使用shared_ptr作为函数接口,尽可能用const shared_ptr&的形式
// 6、多线程模式下使用shared_ptr的注意事项
// 7、shared_ptr和weak_ptr相比于裸指针,空间时间都会有影响,尤其在多线程环境下(还要保证原子操作)
// 8、如果有可能,优先使用类的实例,其次使用std::unique_ptr,最后再用std::shared_ptr


// 创建智能指针的方式(等效的):
// 1、std::shared_ptr<Widget> p(new Widget(1));  会有2次new
// 2、std::shared_ptr<Widget> p = std::make_shared<Widget>(1);  只new一次 效率更高




  1. #include <iostream>
  2. #include <memory>

  3. class Widget : public std::enable_shared_from_this<Widget>{
  4. public:
  5.     Widget(){
  6.         std::cout << "Widget 构造 run" << std::endl;
  7.     }
  8.     ~Widget(){
  9.         std::cout << "Widget 析构 run" << std::endl;
  10.     }

  11.     std::shared_ptr<Widget> GetSharedObject(){
  12.         return std::shared_ptr<Widget>(this);  //错误的方式:从this得到智能指针
  13.     }

  14.     std::shared_ptr<Widget> GetSharedObject_jjj(){
  15.         return this->shared_from_this();     // 正确的方式
  16.     }
  17. };

  18. int main()
  19. {
  20.     //https://zhuanlan.zhihu.com/p/393571228
  21.     // std::shared_ptr<Widget> p(new Widget());   // new 了2次
  22.     std::shared_ptr<Widget> p = std::make_shared<Widget>();   // new 1次即可
  23.     // std::shared_ptr<Widget> q = p->GetSharedObject();
  24.     std::shared_ptr<Widget> q = p->GetSharedObject_jjj();
  25.    
  26.     std::cout << "p的地址:" << &p << ",q的地址:" << &q << std::endl;

  27.     std::cout << p.use_count() << std::endl;
  28.     std::cout << q.use_count() << std::endl;

  29.     return 0;
  30. }



复制代码


让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:27:43 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-26 00:44 , Processed in 0.167257 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表