gpt4 book ai didi

C++ Lambda、捕获、智能 Ptr 和堆栈 : Why Does this Work?

转载 作者:可可西里 更新时间:2023-11-01 17:37:23 27 4
gpt4 key购买 nike

我一直在研究 C++11 中的一些新特性,并尝试编写以下程序,但预计它不会运行。令我惊讶的是,它确实如此(在带有 'std=c++0x' 标志的 Linux x86 上的 GCC 4.6.1 上):

#include <functional>
#include <iostream>
#include <memory>

std::function<int()> count_up_in_2s(const int from) {
std::shared_ptr<int> from_ref(new int(from));
return [from_ref]() { return *from_ref += 2; };
}

int main() {
auto iter_1 = count_up_in_2s(5);
auto iter_2 = count_up_in_2s(10);

for (size_t i = 1; i <= 10; i++)
std::cout << iter_1() << '\t' << iter_2() << '\n'
;
}

我期望在每次执行返回的 lambda 时删除“from_ref”。这是我的推理:一旦运行 count_up_in_2s,from_ref 就会从堆栈中弹出,但是因为返回的 lambda 不一定会立即运行,因为它已返回,所以在短时间内不存在另一个引用,直到相同的引用被调用在 lambda 实际运行时推迟,所以 shared_ptr 的引用计数不应该为零然后删除数据吗?

除非 C++11 的 lambda 捕获比我认为的要聪明得多,否则我会很高兴。如果是这种情况,我是否可以假设 C++11 的变量捕获将允许所有词法作用域/闭包技巧 a la Lisp 只要/something/正在处理动态分配的内存?我可以假设所有捕获的引用都将保持事件状态,直到 lambda 本身被删除,从而允许我以上述方式使用 smart_ptr 吗?

如果这是我认为的那样,这是否意味着 C++11 允许表达高阶编程?如果是这样,我认为 C++11 委员会做得很好 =)

最佳答案

lambda 按值捕获 from_ref,因此它制作了一个拷贝。由于这个拷贝,当 from_ref 被销毁时,引用计数不是 0,而是 1,因为 lambda 中仍然存在拷贝。

关于C++ Lambda、捕获、智能 Ptr 和堆栈 : Why Does this Work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com