【发布时间】:2026-01-25 14:10:02
【问题描述】:
#include <iostream>
#include <functional>
int global = 9;
std::function<void()> functor;
int main()
{
int* ptr = &global;
functor = [ptr]
{
functor = nullptr;
std::cout << *ptr << std::endl;
};
functor();
}
这里是lambda捕获的变量ptr,在functor()调用过程中,仿函数首先通过functor = nullptr删除,然后访问ptr。我认为ptr 已损坏,因为它是已删除函子的字段。所有编译器都成功地执行了该程序而没有崩溃并打印“9”,但我仍然怀疑这不是未定义的行为。有人可以确认吗?
【问题讨论】:
-
@keith 我不认为这是完全重复的。这个问题是关于删除本身的,这个问题似乎集中在兰巴捕获的
ptr。 -
@Whatever:是的,这是完全重复的(
std::function是一个最大尺寸为 1 的容器)