C++ std::bind如何以及为什么使指针保持活动状态

C++ std::bind如何以及为什么使指针保持活动状态,c++,c++11,C++,C++11,将方法与对象指针绑定,然后删除对象,该方法仍然可以调用 struct A { void b(){std::cout << "SUHDU" << std::endl;} }; int main(int argc, const char * argv[]) { A *a = new A; auto f1 = std::bind(&A::b, a); auto f2 = std::bind(&A::b, std::ref(a))

将方法与对象指针绑定,然后删除对象,该方法仍然可以调用

struct A {
    void b(){std::cout << "SUHDU" << std::endl;}
};

int main(int argc, const char * argv[])
{
    A *a = new A;
    auto f1 = std::bind(&A::b, a);
    auto f2 = std::bind(&A::b, std::ref(a));

    f1();
    f2();

    delete a;
    f1(); // still outputs SUHDU
    f2(); // still outputs SUHDU
}
结构A{
void b(){std::cout这是未定义的行为。它存储参数的副本,在您的案例中,
a*
稍后无效。此提示还导致修复:要使示例合法,请使用
std::shared\u ptr

struct A {
    void b(){std::cout << "SUHDU" << std::endl;}
};

int main(int argc, const char * argv[])
{
    auto a = std::make_shared<A>();
    auto f1 = std::bind(&A::b, a);

    f1();

    a.reset();

    f1(); // still outputs SUHDU
}
结构A{
void b(){std::cout这是未定义的行为。它与
std::bind
没有任何关系,真的。@chris所以它只是未重新分配内存。由于它是未定义的行为,所以不能保证您可以使它失败,但您可以让
A
对象的析构函数设置一个指向null的指针,由
b()使用
:这很可能会导致崩溃。例如,
结构a{std::ostream*out;a():out(&std::cout){}~a(){out=0;}void b(){*(this->out)