Skip to content
Artwork for Andrej Karpathy的RSS订阅清单
Andrej Karpathy的RSS订阅清单 · Today · 7 min

程序不崩溃其实更危险:第一次调用竟决定所有对象配置

一次看似有效的 C++ 修复:把局部变量改为函数内 `static`,让 use-after-free 不再崩溃。但 Raymond Chen 进一步揭示,这并非修复,而是把确定的内存生命周期错误转化为更隐蔽的配置污染、跨对象状态干扰,甚至多线程 data race。 本期节目深度解析函数局部静态变量“仅初始化一次”的关键语义,并回到问题根源:当对象需要长期保存一份配置时,类型设计必须清楚表达所有权,而不是依赖引用、`static` 或隐含的生命周期约定。 原文链接: https://devblogs.microsoft.com/oldnewthing/20260928-00/?p=112738/ 原文标题:C++ reminder: Function-local static variables are initialized only once, even if it looks like they get initialized multiple times 主要内容: • `const` 引用不会延长对象生命周期:局部 `info` 返回后被销毁,controller 保留的引用随即悬空,形成典型 use-after-free。 • 函数内 `static` 只会在控制流首次到达时初始化一次;第一次调用的配置会意外成为后续所有对象共享的“全局规则”。 • 每次重新赋值给共享的 `static` 虽避开首次初始化问题,却会让新对象改写旧对象所依赖的配置,造成跨实例状态污染。 • C++11 保证 magic static 的首次初始化线程安全,但不保护后续读写;并发修改或读写共享配置仍会导致 data race 与未定义行为。 • 真正稳妥的方案是让 controller 按值持有配置,或清晰地将配置与 controller 的所有权绑定,避免依赖脆弱的外部生命周期假设。 推荐理由: 这篇文章的价值不止于纠正一个 `static` 初始化误解,更完整展示了“程序不崩溃”如何掩盖更严重的设计问题。它把悬空引用、静态存储期、共享状态、并发安全与 `shared_ptr` 所有权模型串成一条清晰的因果链,提醒我们:长期使用的数据应由使用者拥有,真正的借用才应使用引用。非常值得结合原文代码细读。 --- 「Andrej Karpathy的RSS订阅清单」为您精选全球最前沿的AI技术博客文章,深度剖析技术背后的核心洞察。 由 voieech.com 提供技术支持。

0:00-7:00

transcript

No transcript — this publisher did not publish one.

show notes

一次看似有效的 C++ 修复:把局部变量改为函数内 `static`,让 use-after-free 不再崩溃。但 Raymond Chen 进一步揭示,这并非修复,而是把确定的内存生命周期错误转化为更隐蔽的配置污染、跨对象状态干扰,甚至多线程 data race。

本期节目深度解析函数局部静态变量“仅初始化一次”的关键语义,并回到问题根源:当对象需要长期保存一份配置时,类型设计必须清楚表达所有权,而不是依赖引用、`static` 或隐含的生命周期约定。

原文链接:
https://devblogs.microsoft.com/oldnewthing/20260928-00/?p=112738/

原文标题:C++ reminder: Function-local static variables are initialized only once, even if it looks like they get initialized multiple times

主要内容:

• `const` 引用不会延长对象生命周期:局部 `info` 返回后被销毁,controller 保留的引用随即悬空,形成典型 use-after-free。
• 函数内 `static` 只会在控制流首次到达时初始化一次;第一次调用的配置会意外成为后续所有对象共享的“全局规则”。
• 每次重新赋值给共享的 `static` 虽避开首次初始化问题,却会让新对象改写旧对象所依赖的配置,造成跨实例状态污染。
• C++11 保证 magic static 的首次初始化线程安全,但不保护后续读写;并发修改或读写共享配置仍会导致 data race 与未定义行为。
• 真正稳妥的方案是让 controller 按值持有配置,或清晰地将配置与 controller 的所有权绑定,避免依赖脆弱的外部生命周期假设。

推荐理由:
这篇文章的价值不止于纠正一个 `static` 初始化误解,更完整展示了“程序不崩溃”如何掩盖更严重的设计问题。它把悬空引用、静态存储期、共享状态、并发安全与 `shared_ptr` 所有权模型串成一条清晰的因果链,提醒我们:长期使用的数据应由使用者拥有,真正的借用才应使用引用。非常值得结合原文代码细读。

---

「Andrej Karpathy的RSS订阅清单」为您精选全球最前沿的AI技术博客文章,深度剖析技术背后的核心洞察。
由 voieech.com 提供技术支持。