std :: bind如何以及为什么保持指针活着

时间:2013-09-15 14:14:51

标签: 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));

    f1();
    f2();

    delete a;
    f1(); // still outputs SUHDU
    f2(); // still outputs SUHDU
}

std::bind为什么会这样表现呢?它是如何做到的?

1 个答案:

答案 0 :(得分:5)

这是未定义的行为。它存储了参数的副本,在您的情况下,A*稍后无效。此提示也会导致修复:要使您的示例合法,请使用std::shared_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
}

当然,这将使您的对象保持活跃状态​​,直到f1超出范围。