<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>内存问题 on Yun 的个人博客</title><link>https://yun7211.github.io/tags/%E5%86%85%E5%AD%98%E9%97%AE%E9%A2%98/</link><description>Recent content in 内存问题 on Yun 的个人博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 18 May 2026 10:50:00 +0800</lastBuildDate><atom:link href="https://yun7211.github.io/tags/%E5%86%85%E5%AD%98%E9%97%AE%E9%A2%98/index.xml" rel="self" type="application/rss+xml"/><item><title>C 内存问题排查清单</title><link>https://yun7211.github.io/c-language/debug-quality/debugging-memory-bugs/</link><pubDate>Mon, 18 May 2026 10:50:00 +0800</pubDate><guid>https://yun7211.github.io/c-language/debug-quality/debugging-memory-bugs/</guid><description>&lt;h2 id="常见现象"&gt;常见现象
&lt;/h2&gt;&lt;p&gt;C 内存问题经常表现得很绕：崩溃点不一定是出错点，今天能复现的问题明天可能消失，打开日志后问题也可能变化。&lt;/p&gt;
&lt;p&gt;常见类型包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数组或缓冲区越界&lt;/li&gt;
&lt;li&gt;使用已经释放的指针&lt;/li&gt;
&lt;li&gt;重复释放&lt;/li&gt;
&lt;li&gt;未初始化读取&lt;/li&gt;
&lt;li&gt;资源泄漏&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="先缩小范围"&gt;先缩小范围
&lt;/h2&gt;&lt;p&gt;不要一开始就盯着崩溃现场。先确认最近改动、输入数据规模、线程数量、编译优化级别和是否只在特定平台出现。&lt;/p&gt;
&lt;p&gt;如果问题能稳定复现，优先构造最小复现用例。&lt;/p&gt;
&lt;h2 id="检查边界"&gt;检查边界
&lt;/h2&gt;&lt;p&gt;内存越界通常和长度计算有关。重点检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缓冲区大小是否包含结尾 &lt;code&gt;\0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memcpy&lt;/code&gt; 长度是否来自可信来源&lt;/li&gt;
&lt;li&gt;循环边界是否使用 &lt;code&gt;&amp;lt;&lt;/code&gt; 而不是误用 &lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;结构体长度和协议字段是否一致&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="检查生命周期"&gt;检查生命周期
&lt;/h2&gt;&lt;p&gt;悬空指针来自对象生命周期结束后继续访问。释放后可以把指针置为 &lt;code&gt;NULL&lt;/code&gt;，但这只能减少部分误用，不能替代清晰的所有权设计。&lt;/p&gt;
&lt;h2 id="小结"&gt;小结
&lt;/h2&gt;&lt;p&gt;排查内存问题要有耐心，也要有方法。先稳定复现，再缩小范围，最后回到边界、生命周期和错误路径。&lt;/p&gt;</description></item></channel></rss>