东方耀AI技术分享
标题:
使用智能指针需要注意的几个“坑”
[打印本页]
作者:
东方耀
时间:
2021-9-16 17:50
标题:
使用智能指针需要注意的几个“坑”
// 使用智能指针需要注意的几个“坑”:
// 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一次 效率更高
#include <iostream>
#include <memory>
class Widget : public std::enable_shared_from_this<Widget>{
public:
Widget(){
std::cout << "Widget 构造 run" << std::endl;
}
~Widget(){
std::cout << "Widget 析构 run" << std::endl;
}
std::shared_ptr<Widget> GetSharedObject(){
return std::shared_ptr<Widget>(this); //错误的方式:从this得到智能指针
}
std::shared_ptr<Widget> GetSharedObject_jjj(){
return this->shared_from_this(); // 正确的方式
}
};
int main()
{
//https://zhuanlan.zhihu.com/p/393571228
// std::shared_ptr<Widget> p(new Widget()); // new 了2次
std::shared_ptr<Widget> p = std::make_shared<Widget>(); // new 1次即可
// std::shared_ptr<Widget> q = p->GetSharedObject();
std::shared_ptr<Widget> q = p->GetSharedObject_jjj();
std::cout << "p的地址:" << &p << ",q的地址:" << &q << std::endl;
std::cout << p.use_count() << std::endl;
std::cout << q.use_count() << std::endl;
return 0;
}
复制代码
作者:
zouqiqi
时间:
2021-11-23 19:27
让天下人人学会人工智能!人工智能的前景一片大好!
欢迎光临 东方耀AI技术分享 (http://www.ai111.vip/)
Powered by Discuz! X3.4