c++ - 如果我使用 std::function 捕获 lambda,我应该担心它被释放吗?
问题描述
考虑以下代码,
std::function<void(void)> f = []() {};
std::function<void(void)>* fp = new std::function<void(void)>(f);
每当程序离开这些行的上下文时(假设它们在函数内部被调用并且函数返回)f
并且fp
's 的内存可能会在某个时候被回收。这很好,因为我只对它感兴趣fp
并且我得到了它的副本。
关键是有一个函数指针 ( fp
),我以后可以随时调用它。所以,只要我不这样做delete fp
,问题就是:
是否会f
被解除分配,导致fp
无效?
解决方案
该声明:
std::function<void(void)>* fp = new std::function<void(void)>(f);
调用复制构造函数function(std::function<void ()> const&)
并f
存储在 . 指向的内存中fp
。
所以fp
除非被删除,否则不会失效。
正如评论中所指出的,它与用于初始化另一个使用new
. 局部变量的寿命不会影响指针变量的后续使用,除非指针本身被删除。
推荐阅读
- android - 从 /app/ 文件夹中读取自定义文件 - Android
- kotlin - Transactional kafkalistener 中的 kafkaTemplate 在事务回滚时发布消息
- python - Tkinter:在 tkinter 文本 GUI 小部件中显示项目列表
- sparql - 为什么我在结果中得到重复?(DBpedia sparql 查询)
- templates - Drupal 8将模块模板分配给页面
- c# - Asp.net Core - IdentityDbContext 不创建其他表,只创建身份表
- php - 用PHP访问wifi路由器
- vba - VBA 将结果 IF 语句作为列表放入一个单元格
- html - 在这种情况下,Symfony4 元素图例不允许作为元素 div 的子元素
- django - Django:RecursionError:超出最大递归深度