chromium源码中的callback

BindRepeating/BindOnce

BindRepeating返回RepeatingCallback函数对象,BindOnce返回OnceCallback函数对象,两者之间的区别时RepeatingCallback可以调用多次,而BindOnce只能调一次。

void Foo() {
   
  printf("Hello, world");
}

base::RepeatingCallback<void()> a = base::BindRepeating(&Foo);
a.Run(); //正确,输出Hello, world
a.Run(); //正确,再次输出Hello, world

base::OnceCallback<void()> a = base::BindOnce(&Foo);
a.Run(); //错误,编译报错
std::move(a).Run(); //正确,输出Hello, world
std::move(a).Run(); //错误,前一次调用已经将a置为空

以下是base::Bind/Callback相关的别名

using Bind = BindRepeating;
using Callback = OnceCallback;
using Closure = RepeatingCallback<void()>;
using OnceClosure = OnceCallback<void()>;

Bind/Callback中的内存管理

由于Chromium代码中有大量的异步操作,因此在调用函数对象之前,函数对象绑定的参数极有可能已经被delete掉了。

比如以下代码中的load_callback函数对象,如果在调用load_callback之前,this指针因为某些原因(比如用户点击MyView的关闭按钮)被delete掉。

auto load_callback = std::bind(&MyView::OnLoadComplete, this
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值