std :: function delete-its在调用期间?

时间:2017-05-10 06:25:13

标签: c++11

在某些情况下,我必须在std :: function调用期间使用std :: function delete -self:

    std::function<void (void)> test;
    std::shared_ptr<int> tt = std::make_shared<int>(10);
    test = [=,&test]() 
    {
        std::cout << tt.use_count() << std::endl;
        test = nullptr; // destroy self
        return;
    };
    std::cout << tt.use_count() << std::endl;
    tt = nullptr;
    test();

这会有问题吗?因为它在调用期间会破坏它自己。对于vs2015和xcode来说它是可以的。 或者我应该这样写:

test = [=,&test]() 
    {
        std::shared_ptr<void> raii(nullptr,[&](){ test = nullptr;  }); // destroy itself
        std::cout << tt.use_count() << std::endl;
        return;
    };

1 个答案:

答案 0 :(得分:1)

你的lambda函数基本上是一个实现其可调用运算符的闭包对象。该对象被复制到使用HEAP的std::function中。

您可以使用以下简单示例对此进行测试:

#include <functional>
#include <iostream>
void myTest( std::function<int()> &ref)
{
    static int vs = 4;
    int v = vs;
    ref = [v]()->int{return v;};
    vs++;
}

int main()
{
    std::function<int()> test;

    for (int i=0; i<10; i++)
    {
        myTest(test);
        std::cout << "Another closure call: " << test() << std::endl;
    }

    std::cout << "sizeof function: " << sizeof(test) << std::endl;
}

考虑到这一点,以及以下问题,您可以重置该功能,当然,请注意不要访问其他成员。

  

Is delete this allowed?

会出现问题吗?如果您不访问成员,则不会。

或者我应该这样写?这对你自己来说更安全,但不是必需的。

相关问题