下面我们直接看代码。
usingnamespacestd; classA{ public: A() { cout<<"A()"<<endl; } ~A() { cout<<"~A()"<<endl; } voidtestA() { cout<<"非常好用的方法!"<<endl; } }; //子线程voidhandler01(weak_ptr<A>pw) { // q访问A对象的时候,需要侦测一下A对象是否存活,保证访问的这块内存是合法的std::this_thread::sleep_for(std::chrono::milliseconds(200)); shared_ptr<A>sp=pw.lock(); if (sp!=nullptr) // 提升成功资源合法 { sp->testA(); } else//否则资源已经释放 { cout<<"A对象已经析构,不能再访问"<<endl; } } //main线程intmain(void) { { shared_ptr<A>p(newA()); threadt1(handler01, p); t1.detach(); } // 出了大括号资源已经释放,另外一根指针就无法访问std::this_thread::sleep_for(std::chrono::seconds(20)); //t1.join();return0; }
结合代码和注释下次遇到这种问题的时候我们应该就应该要有一些思考了。