在编写 lambda 函数向量时出现隔离错误
Segfault while composing vector of lambda functions
我正在尝试创建一个接受函数向量的compose_all
lambda,并返回一个函数,该函数是向量中所有函数的组合:
#include <algorithm>
#include <iostream>
#include <vector>
#include <functional>
using std::cout;
using std::endl;
using std::function;
using std::vector;
int main() {
vector<function<int(int)>> functions = {
[](int x) { return 2 * x; },
[](int x) { return x * x; },
[](int x) { return -x; },
};
function<function<int(int)>(
vector<function<int(int)>>::iterator,
vector<function<int(int)>>::iterator,
function<int(int)>)> compose_all;
compose_all = [&](vector<function<int(int)>>::iterator f_begin,
vector<function<int(int)>>::iterator f_end,
function<int(int)> f) -> function<int(int)> {
for (; f_begin < f_end; ++f_begin) {
f = [&](int x) { return (*f_begin)(f(x)); };
}
return f;
};
auto composition = compose_all(functions.begin(),
functions.end(),
[](int x) { return x; });
for (int i = 0; i < 10; ++i) {
cout << composition(i) << endl;
}
return 0;
}
虽然这编译得很好,但它会出现段错误:
$ clang++ -std=c++11 -g composition.cpp && ./a.out
Segmentation fault (core dumped)
段错误的原因是什么,解决方法是什么?
使用打印语句和 GDB 进行调试的说明:
- 迭代器由
compose_all
正确接收 - 段错误发生在线路上
f = [&](int x) { return (*f_begin)(f(x)); };
- 单独取消引用
f_begin
会产生正确的结果(它在向量中调用正确的 lambda)
创建的每个 lambda
f = [&](int x) { return (*f_begin)(f(x)); };
通过引用捕获f
和f_begin
,其中两者都是存储在 compose_all
中的 lambda 主体的本地。
这些函数中的最后一个在调用时由compose_all
包含的lambda的主体返回,然后分配给composition
。但是由于compose_all
的λ的主体已经退出,f
和f_begin
的生命周期已经结束,调用composition
是未定义的行为。
此外,你真的不希望f
调用自己,这只会让你无限递归。您希望f
从f
的当前值(即初始值或上次分配f
值)调用 值的副本。
你需要这样的东西:
const auto& g = *f_begin;
f = [=](int x) { return g(f(x)); };
(或者在 C++14 或更高版本中,可以这样写:)
f = [f, g=*f_begin](int x) { return g(f(x)); };
相关文章:
- 从矢量中删除元素后出现隔离错误
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 线程时访问静态映射时出现隔离错误
- 并行快速排序分区中的隔离错误
- C++多线程程序:变量定义为类成员的隔离错误
- TFLite 隔离错误,通过获取C++输入和输出
- 我只是在寻找模板,在我的书中找到了这段代码,这显示了隔离错误?
- pthread_create中错误 4 的隔离错误
- 递归树遍历/分支删除的隔离错误
- 在类模板上使用 arm gcc 编译期间的隔离错误
- 从大量文件读取时出现隔离错误
- 在PHP扩展中使用emalloc从线程时出现隔离错误
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- 在QT中单击菜单时出现隔离错误
- 尝试访问标头声明成员时出现隔离错误
- 搜索链表时出现隔离错误
- 模板化子类析构函数中的隔离错误
- 插件中节点.js/Nan 回调C++不频繁的隔离错误
- 将行添加到 GTKTreeView 时的隔离错误
- 找不到命令时打开的隔离错误