【发布时间】:2013-09-16 01:36:56
【问题描述】:
我有以下代码:
#include <functional>
#include <memory>
#include <string>
#include <iostream>
struct A{
int i = 5;
};
class B{
std::unique_ptr<A> a;
std::function<void (void)> f;
public:
B(std::unique_ptr<A> a)
: a(std::move(a)),
f([&](){
std::cout << a->i << '\n'; //segfaults when executing a->i
})
{}
B()
: a(new A),
f([&](){
std::cout << a->i << '\n'; //works fine
})
{}
void execLambda(){
f();
}
void exec(){
std::cout << a->i << '\n'; //works fine
}
};
int main(){
B b1;
b1.exec(); //works fine
b1.execLambda(); //works fine
B b2(std::unique_ptr<A>(new A));
b2.exec(); //works fine
b2.execLambda(); //will segfault
return 0;
}
似乎当一个对象声明对现有 unique_ptr 的所有权并在 lambda 中使用该 unique_ptr 时,会发生分段错误。为什么在这种特定情况下会出现分段错误?无论如何在所有权已转移的 lambda 中使用 unique_ptr 吗?
非常感谢!
【问题讨论】:
-
我猜我会说 lambda 正在从构造函数中捕获
a- 你从中移动的那个 - 而不是类中的那个。 -
不要给所有东西取同一个名字? :-)
-
乔纳森所说的,是特定的行为
-
@Jonathan:就是这样!我不敢相信我没有意识到这一点。非常感谢!
标签: c++ c++11 lambda segmentation-fault unique-ptr