首页IT科技指针类型强转哪个安全(强弱指针使用场景之 多线程访问共享对象问题)

指针类型强转哪个安全(强弱指针使用场景之 多线程访问共享对象问题)

时间2025-08-01 06:51:47分类IT科技浏览5144
导读:代码1 #...

代码1

#include <iostream> #include <thread> using namespace std; class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void funcA() { cout << "A function()" << endl; } }; void thread_Handler(A *pa) { std::this_thread::sleep_for(std::chrono::seconds(2)); pa->funcA(); } int main() { A *pa = new A(); thread t1(thread_Handler, pa); delete pa; t1.join(); return 0; } 上面代码的问题: std::this_thread::sleep_for(std::chrono::seconds(2)); 后 pa指针已经main 线程中delete 掉了,删掉之后在访问 funcA()函数是不合理的 应该修改为 void thread_Handler(A *pa) { std::this_thread::sleep_for(std::chrono::seconds(2)); if(pa所指向的对象是否还有效) { pa->funcA(); } } //针对上面的场景,我们可以使用强弱智能指针,修改如下

代码2

#include <iostream> #include <thread> using namespace std; class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void funcA() { cout << "A function()" << endl; } }; void thread_Handler(weak_ptr<A> pa) { std::this_thread::sleep_for(std::chrono::seconds(2)); shared_ptr<A> ptr = pa.lock(); if (ptr == nullptr) { cout << "对象已经销毁了" << endl; } else { ptr->funcA(); } } int main() { { shared_ptr<A> ptr(new A()); thread t1(thread_Handler, weak_ptr<A>(ptr)); t1.detach(); } std::this_thread::sleep_for(std::chrono::seconds(10)); return 0; }

强弱指针使用场景之 多线程访问共享对象问题

share_ptr share_ptr是C++11新添加的智能指针               ,它限定的资源可以被多个指针共享               。

只有指向动态分配的对象的指针才能交给 shared_ptr 对象托管                    。将指向普通局部变量               、全局变量的指针交给 shared_ptr 托管                    ,编译时不会有问题        ,但程序运行时会出错            ,因为不能析构一个并没有指向动态分配的内存空间的指针

weak_ptr weak_ptr是一种用于解决shared_ptr相互引用时产生死锁问题的智能指针        。如果有两个shared_ptr相互引用                    ,那么这两个shared_ptr指针的引用计数永远不会下降为0            ,资源永远不会释放            。weak_ptr是对对象的一种弱引用        ,它不会增加对象的use_count                    ,weak_ptr和shared_ptr可以相互转化               ,shared_ptr可以直接赋值给weak_ptr    ,weak_ptr也可以通过调用lock函数来获得shared_ptr                    。

weak_ptr指针通常不单独使用                     ,只能和 shared_ptr 类型指针搭配使用            。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数        。一旦最后一个指向对象的shared_ptr被销毁                  ,对象就会被释放                    。即使有weak_ptr指向对象,对象也还是会被释放               。

weak_ptr并没有重载operator->和operator *操作符                  ,因此不可直接通过weak_ptr使用对象                     ,典型的用法是调用其lock函数来获得shared_ptr示例    ,进而访问原始对象    。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
百度文库怎么运营(百度文库经营模式) 注册赚钱的软件有没有风险(注册赚钱网站有哪些-自媒体平台有哪些?怎么用自媒体多账号管理工具从自媒体平台赚钱)