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

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

时间2025-06-13 19:39:01分类IT科技浏览4646
导读:代码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
clipmap(【代码实践】使用CLIP做一些多模态的事情) python unittest教程(python中unittest的核心组成)