gpt4 book ai didi

c++ - 在 C++ 中使用函数装饰器(使用闭包)时出现意外的段错误

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

我创建了 decorator 函数来为现有函数添加功能。该程序输出正确的函数指针地址以及耗时以按预期迭代 10 x helloworld

但是,如果我更改 decorator 函数以按值 (FunctionPointer original_function) 获取 original_function,程序将因段错误而终止,我不明白它失败的原因。

#include <iostream>
#include <chrono>

typedef void (*FunctionPointer)();

auto
decorator(FunctionPointer && original_function) // if changed to FunctionPointer original_function, it causes segmentation fault when the closure(lambda expression) is called later on
{
std::cout << "Decorator: " << (void*)original_function << std::endl; // 0x558072fb0b90
return [&]()
{
std::cout << "Decorator: " << (void*)original_function << std::endl; // 0x558072fb0b90 but 0x0 when original_function passed by value
auto t0 = std::chrono::high_resolution_clock::now();

original_function();

auto duration = std::chrono::high_resolution_clock::now() - t0;

std::cout << "\nElapsed " << duration.count() * 1000.0f << " ms\n";
};
}


void
helloworld(void)
{
for (auto i = 0; i < 10; i++)
std::cout << "Hello, World!\n";
}

int
main(void)
{
std::cout << "Main: " << (void*)helloworld << std::endl; // 0x558072fb0b90

auto my_helloworld = decorator(helloworld);
my_helloworld();

return 0;
}

最佳答案

不同之处在于,当您按值传递函数时,传入 lambda 的参数是对函数参数的引用,当 decorator 时,它超出了作用域返回。当您稍后调用返回的 lambda 时,您引用了这个超出范围的变量,即未定义行为。

当你通过通用引用传递时它起作用,传递给 decorator 的参数是一个引用,它被传递给 lambda。所以当你调用 lambda 时它仍然有效。

您可以将 lambda 更改为按值传递(使用 [=])以使更改后的版本生效。

关于c++ - 在 C++ 中使用函数装饰器(使用闭包)时出现意外的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56943685/

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