C++中常见内存错误及对策浅析

  • 格式:pdf
  • 大小:159.03 KB
  • 文档页数:2

l 引 言
作 。 特 别 是 在 fr 环 语 句 中 , 循 环 次 数 很 容 易 搞 错 , 导致 o循 数组操作越界。
c + 序设计语言 中提供 的动 态内存机 制为灵活地进行 +程 程序设 计提供 了方便 。动 态 内存 的分配与 使用是在 程序运
行 过 程 中 按 照 算 法 的 要 求 , 由程 序 员 编 写 相 应 的程 序 实 现
Absr c : e d n mi e o y m e h ns p o i e y C++ p og a d sg a g a e o fr n e s y t e in ta tTh y a c m m r c a im r vd d b r r m e in ln u g fe s a a y wa o d sg
nw e 操作失败则返回N L ,而不产生异常。 UL
( )忘 记 释 放 内 存 , 造 成 内存 泄 露 。含 有这 种 错 误 的 5
2 常见内存错误及对策 ( )内存分配未成 功,却使用 了它 。编程新手 常犯 这 1 种错 误,因 为他 们没有 意识到 内存分配会 不成 功。常用解
Anay i fCo m o e o yEro sa d Pr v n o n C+ + lsso m n M m r r r n e e f n i i ZHANG a 1 n Tin. a g i
( olg f t s P yisNa j gUnv ri f no main& T c n lg , nig2 0 4 C l e h & h s , ni i st o fr t e o Ma c n e y I o e h oo yNa j 4 ) n 1 0
( )内存不足 的 问题 。如果n w 4 e 操作 找不到 足够大 的 内存块 ,则 引发b da lc a — lo 标准类 型的异常 ,为 了提高程序 的可靠性 ,程序 中必须 能捕获这种 内存分 配失败 引发的异 常,这是 一般程序 员容 易忽视 的问题 。不过因为异 常处理 执 行 效率 不 高 ,所 以可 用 下 述 方 法 使 n w 作返 回一 个 e操
C+ + 中常见内存错误 及对策浅析
张 天 良
( 南京 信 息 工 程 大 学 数理 学 院 , 江 苏 南 京 2 0 4 1 4) 0

要 :c + + 程序 设 计语言 动态 内存 机制 为灵活 地进 行程 序 设计提 供 了方便 ,但 同时也增 加 了各种 内存 错误 发 生的机
会 。本文 分析 了c + + 中常 见的 内存错误 ,提 出 了解决对 策和 预 防措施 ,以期抛砖 引玉 为初 学者提供一 些帮助 。 关键词 :c +;内存错误 ;内存泄 漏 +
能 自动 发 现 ,通 常 是 在 程 序 运 行 时才 能 捕 捉 到 。发 生 内存 错 误 是 件 非 常 麻 烦 的 事 情 ,这 些 错 误 会 导 致 系 统 的 效 率 降
低甚至崩溃 ,从而 降低 了系统 运行过 程中 的可 靠性 。据 统 计,在使用到动态 内存 的软件 系统 中,5% 0 的软件 故障与动
pr g a .uta h a i e i i c e s s t e c a c s o a i u m o y e r r . i a e n r d e h ommo o r msb tt e s me tm t n r a e h h n e fv ro s me r ro sTh sp p r ito uc s t e c n
决 办 法 是 ,在 使 用 内存 之 前 检 查 指 针 是 否 为 N L 。 如 果 指 UL
函数 每被调用 一次就 丢失一 块 内存 。刚开始 时系统 的内存 充足 ,不 易发现 。终有一次 程序突然 死掉 ,系统提示 : 内
存耗尽 。
① 动 态 内存 的 申请 与 释 放 必 须 配 对 。程 序 中n w e 与
态 内 存 的 管 理 有 关 。因 此 ,笔 者 总 结 了C + + 中一 些 常 见 内 存
错误及解决对策 。
i (P {o t < a l c t o a lr :eu n } f !) c u < lo a in f iu e r tr :
这 里 对 象 n tr w 在 nw 定 义 的 常 量 , 指 出 如 果 oho是 e中
N 而 不抛 出一 个异 常 。例 如 程宇 段 : UL
B p n w(o h o ) : * : e n t r w B
的 。由于动态 内存 “ 手工 ”管 理的特 点 . 导致程 序中存在多
种与动态 内存管理 有关 的错 误 ,如 内存泄漏 、空指针 引用 等 。这些错 误大 多没有 明显的症状 ,时隐 时现 ,编 译器不
m e o ye r r n r p s ss m esr tg sa dm e s rst rv n h m . m r ro sa d p o o e o taa e n a u e o p e e t e t
Ke r sC/ ywo d : C++; mo ye r r ; mo yla a e me r ro sme r k g e
针 P 函 数 的 参 数 ,那 么 在 函 数 的 入 口处 用 as e 是 s rt
( ! N L ) 行 检 查 。如 果 是 用 m 1 或 n w 申请 P= U L 进 a1 o c 来 e 内存 , 应 该用 i (= N L ) 或 i ( _ UL 进 行 防 错 处 理 。 fp=UL fPf_ L ) N ( ) 内存 分 配 虽 然 成 功 ,但 是 尚 未初 始 化 就 引 用 它 。 2 犯 这 种 错 误 主 要 有 两 个 起 因 : 一 是 没 有 初 始 化 的观 念 ; 二 是 误 以 为 内 存 的缺 省 初 值 全 为 零 , 导 致 引用 初 值 错 误 ( 例