gpt4 book ai didi

c++11 - std::function 在调用期间删除自身?

转载 作者:行者123 更新时间:2023-12-01 04:48:48 24 4
gpt4 key购买 nike

在某些情况下,我必须在 std::function 调用期间 std::function 删除自身:

    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;
};

最佳答案

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

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

#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?



会不会有问题? 如果您不访问成员,则不会。

还是我应该这样写? 这对您自己更安全,但不是必需的。

关于c++11 - std::function 在调用期间删除自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43884958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com