有人可以描述为什么这段代码不起作用(在GCC4.7.3 seg-faults从调用返回之前)?C++中lambda的内存管理11
#include <iostream>
#include <functional>
#include <memory>
using namespace std;
template<typename F>
auto memo(const F &x) -> std::function<decltype(x())()> {
typedef decltype(x()) return_type;
typedef std::function<return_type()> thunk_type;
std::shared_ptr<thunk_type> thunk_ptr = std::make_shared<thunk_type>();
*thunk_ptr = [thunk_ptr, &x]() {
cerr << "First " << thunk_ptr.get() << endl;
auto val = x();
*thunk_ptr = [val]() { return val; };
return (*thunk_ptr)();
};
return [thunk_ptr]() { return (*thunk_ptr)(); };
};
int foo() {
cerr << "Hi" << endl;
return 42;
}
int main() {
auto x = memo(foo);
cout << x() << endl ;
cout << x() << endl ;
cout << x() << endl ;
};
我原来的假设:
-
每个
std::function<T()>
是有点儿参考/ shared_ptr的一些对象,表示闭合。即收购价值的生命周期受其限制。std::function<T()>
对象具有赋值运算符,该运算符将放弃旧闭包(最终生命期拾取值)并将获得新值的所有权。
P.S.
[thunk_ptr, &x]() {
auto val = x();
*thunk_ptr = [val]() { return val; };
return (*thunk_ptr)(); // <--- references a non-existant local variable
}
的问题是,当地thunk_ptr
是从上下文的副本:我读question about lazy in C++11
嗯,不知何故'thunk_ptr'最终拥有本身。这看起来不正确。 –
@KerrekSB,是的,同意,但这应该得到内存泄漏,而不是seg-fault – ony
返回(* thunk_ptr)();的原因是返回引用字段的封闭[val](){return VAL; }如果引用添加到'thunk_type'。请参阅(在我的答案中替代实现'lazy')[http://stackoverflow.com/a/19125422/230744] – ony