一、绑定对象会拷贝
使用std::bind绑定对象时,会拷贝新对象,作为内部调用成员函数的对象。那么如果类中有指针且未实现深拷贝,可能会出错。如下:
class A
{
public:
A()
{
pa = new int(9);
}
~A()
{
delete pa;
pa = nullptr;
}
int geta()
{
return *this->pa;
}
private:
int *pa = nullptr;
};
int main()
{
{
A a;
auto f = std::bind(&A::geta, a);
f();
}
system("pause");
return 0;
}
定义A a会创建pa指针分配内存;执行auto f = std::bind(&A::geta, a);会拷贝a的一个副本作为bind内部_Binder类的一个对象,且和a共享类pa分配的内存。当退出{},a析构会删除pa内存,接着_Binder内部a副本对象也会析构,再次删除pa指向的内存,重复删除导致崩溃。
二、绑定对象指针回调前保证指针有效
std::bind绑定对象指针,那么在回调前,如果删除了指针,会引发崩溃,如下:
class A
{
public:
A()
{
pa = new int(9);
}
~A()
{
delete pa;
pa = nullptr;
}
int geta()
{
return *this->pa;
}
private:
int *pa = nullptr;
};
int main()
{
std::function<int(void)> f;
{
A a;
f = std::bind(&A::geta, &a);
}
f();
system("pause");
return 0;
}
在退出{}后,f内部的A指针,已经悬浮指针(指向{}中的a),所以调用f(),会引发崩溃。