【发布时间】:2020-07-27 13:34:34
【问题描述】:
我正在尝试定义函数向量。当函数被调用时,它们可以在向量中添加或删除项目。
超简化,类似于下面的代码。
#include <functional>
#include <vector>
int main()
{
using F = std::function<void()>;
std::vector<F> v;
v.push_back([&v]{
puts("v0");
v.push_back([]{puts("v1");});
v.push_back([]{puts("v2");});
v.push_back([]{puts("v3");});
v.push_back([]{puts("v4");});
v.push_back([]{puts("v4");});
v.push_back([]{puts("v5");});
v.push_back([]{puts("v6");});
});
v[0]();
}
代码编译正常,但运行时调用 V0 函数时出现段错误。
$ v0
$ Erreur de segmentation (core dumped)
我知道这个问题与向量重新分配有关(因为如果我在调用 V0 之前添加一个v.reserve(10); 它工作正常),但我仍然不明白该代码有什么问题以及为什么它不/应该不行。
【问题讨论】:
-
它基本上是
class C { void f() { delete this; DoSomethingMore(); };的精致版本 -
作为一种解决方法,您可以调用
v[0]的副本:F{v[0]}();。 -
调用 v[0] 的副本实际上可以在我的实际用例中工作,感谢您的建议。
标签: c++ stdvector std-function