Ai đó có thể mô tả lý do tại sao mã này không hoạt động (trên GCC4.7.3 seg-lỗi trước khi trở về từ cuộc gọi)?bộ nhớ quản lý cho lambda trong C++ 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 ;
};
giả định ban đầu của tôi:
-
mỗi
std::function<T()>
là kinda tham khảo/shared_ptr đối với một số đối tượng đại diện cho đóng cửa. I E. thời gian sống của giá trị được chọn bị giới hạn bởi nó.std::function<T()>
đối tượng có toán tử gán sẽ từ bỏ đóng cửa cũ (giá trị được chọn vào thời gian kết thúc) và sẽ sở hữu một giá trị mới.
P.S. Câu hỏi này đưa ra sau khi tôi đọc question about lazy in C++11
Hm, bằng cách nào đó 'thunk_ptr' kết thúc sở hữu riêng của mình. Điều đó có vẻ không đúng. –
@KerrekSB, có, đồng ý, nhưng điều này sẽ bị rò rỉ bộ nhớ chứ không phải là lỗi – ony
Lý do đằng sau 'return (* thunk_ptr)();' là trả về tham chiếu đến trường đóng '[val]() {return val; } 'nếu tham chiếu được thêm vào' thunk_type'. Xem (thực hiện thay thế 'lười biếng' trong câu trả lời của tôi) [http://stackoverflow.com/a/19125422/230744] – ony