还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

c++11 智能指针回调的经典场景

来源:清泛原创     2020-08-24 13:25:22    人气:     我有话说( 0 人参与)

c++11 智能指针回调经典测试案例,当回调函数需要使用原对象指针时不确定原对象是否已经释放,这时必须使用智能指针了,代码如下: includ

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、传入强/弱指针都可以解决,区别在于:
     强指针:任务都要执行;
     弱指针:允许某情况下任务丢弃不执行。

c++11 shared_ptr weak_ptr callback

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)
分享到: