c++11 智能指针回调经典测试案例,当回调函数需要使用原对象指针时不确定原对象是否已经释放,这时必须使用智能指针了,代码如下:
#include <iostream>
#include <thread>
#include "../thread/threadpool.hpp"
std::threadpool pool(1);
class Client;
typedef std::shared_ptr<Client> ClientPtr;
typedef std::weak_ptr<Client> ClientWPtr;
class Client : public std::enable_shared_from_this<Client> {
public:
Client() { std::cout << "Client" << std::endl; }
~Client() { std::cout << "~Client" << std::endl; }
void Output() { std::cout << "client out." << std::endl; }
//回调函数使用: 强指针:任务都要执行;弱指针:允许某情况下任务丢弃不执行。
void Test( ClientWPtr wPtr) {
auto backtask = [&, wPtr](){
std::cout << "client task begin..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(50));
ClientPtr myClient = wPtr.lock();
//auto myClient = shared_from_this(); //在本对象中使用必须依赖本对象存在,如果本对象已释放,它的行为不确定。
if (myClient) {
myClient->Output();
} else {
std::cout << "!!!!client is already released!!!!" << std::endl;
}
std::cout << "client task end." << std::endl;
};
pool.commit(backtask);
}
};
void test_sft() {
ClientPtr client(new Client());
client->Test(client);
}
测试场景:1、测试回调函数中使用本对象的场景。
2、shared_from_this 不等于 lock,不适用此场景。
3、传入强/弱指针都可以解决,区别在于:
强指针:任务都要执行;
弱指针:允许某情况下任务丢弃不执行。