在某些情况下,我必须在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;
};
答案 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;
}
考虑到这一点,以及以下问题,您可以重置该功能,当然,请注意不要访问其他成员。
会出现问题吗?如果您不访问成员,则不会。
或者我应该这样写?这对你自己来说更安全,但不是必需的。