以下代码,在对象A被析构后,去访问A的成员对象,显然是不合理的。
class A
{
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void testA() { cout << "非常好用的方法" << endl; }
};
//子线程
void handler01(A* q)
{
this_thread::sleep_for(chrono::seconds(2));
//q访问A对象的时候,需要侦测以下A对象是否存活
q->testA();
}
//main线程
int main()
{
A* p = new A();
thread t1(handler01, p);
delete p;
t1.join();
return 0;
}
使用智能指针解决这个问题,当智能指针引用计数为0,被析构时,不能访问类A中的成员函数,代码如下:
class A
{
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void testA() { cout << "非常好用的方法" << endl; }
};
//子线程
void handler01(weak_ptr<A> pw)
{
this_thread::sleep_for(chrono::seconds(2));
//q访问A对象的时候,需要侦测以下A对象是否存活
shared_ptr<A> sp = pw.lock();
if (sp != nullptr)
{
sp->testA();
}
else
{
cout << "A对象已经析构,不能再访问!" << endl;
}
}
//main线程
int main()
{
{
shared_ptr<A> p(new A());
thread t1(handler01, weak_ptr<A>(p));
t1.detach();
}
this_thread::sleep_for(chrono::seconds(5));
//阻塞等待子线程结束
//t1.join();
return 0;
}
当资源未被释放时,则可以被访问,代码如下:
class A
{
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void testA() { cout << "非常好用的方法" << endl; }
};
//子线程
void handler01(weak_ptr<A> pw)
{
this_thread::sleep_for(chrono::seconds(2));
//q访问A对象的时候,需要侦测以下A对象是否存活
shared_ptr<A> sp = pw.lock();
if (sp != nullptr)
{
sp->testA();
}
else
{
cout << "A对象已经析构,不能再访问!" << endl;
}
}
//main线程
int main()
{
{
shared_ptr<A> p(new A());
thread t1(handler01, weak_ptr<A>(p));
t1.detach();
this_thread::sleep_for(chrono::seconds(3));
}
this_thread::sleep_for(chrono::seconds(5));
//阻塞等待子线程结束
//t1.join();
return 0;
}