- 1、本文档共67页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
part one_2
Part Ⅰ_2 数组和指针 指针和引用 智能指针 内存管理 常见的内存错误的类别 内存编程的策略 2.1 数组和指针 2.2 指针和引用 2.3 智能指针 2.4 字符串的处理 2.5 内存管理 2.5.1内存错误_内存破坏 2.5.1 内存错误_指针滥用 2.5.1 内存错误_其它 2.5.2内存错误_内存泄漏 2.5.3 内存编程的策略 1.良好的编程风格 3.写自己的内存管理函数 动态内存分配错误 ?动态内存分配错误有两种基本类型:内存错误和内存泄漏。? ? (1)内存错误? ? 当一个指针或者该指针所指向的内存单元成为无效单元,或者内存中分配的数据结构被破坏时,就会造成内存错误。指针未被初始化,指针被初始化为一个无效地 址,指针被不小心错误地修改,在与指针相关联的内存区域被释放后使用该指针(这种指针被称为虚悬(dangling)指针),这些都会使指针变为无效指 针。当通过一个错误指针或者虚悬指针对内存进行写入,或者将指针强制转换为不匹配的数据结构,又或者是写数据越界,内存自身也会遭到破坏。删除未被初始化 的指针、删除非堆指针、多次删除同一指针或者覆盖一个指针的内部数据结构,都会造成内存分配系统错误。 (2)内存泄漏 ? 内存泄漏在被动态分配的内存没有被释放时产生。有许多情况会导致内存泄漏,如没有在程序的全部执行路径中释放内存,没有在析构函数中释放所有的内存等。一个程序在崩溃之前可运行的时间越长,则导致崩溃的原因与内存泄漏的关系越大。? Windows会在程序结束的时候将泄漏的内存收回,因此内存泄漏是个暂时性的问题。但为什么必须消除内存泄露呢?首先,内存泄漏往往会导致系统资源的泄 漏。动态分配内存往往不仅仅代表一块存储区域,还代表了某些类型的系统资源,如文件、窗口、设备上下文、GDI对象等。其次,高质量的程序和特定的服务器 程序必须能够无限地运行下去。最后,内存泄漏往往是其他程序错误或不良编程习惯的征兆。 ? 导致内参泄漏的原因:忘记释放内存;构造函数失败;存在内存泄漏的析构函数;存在内存泄漏的异常处理程序;多个返回语句;使用错误形式的delete。 在内存处理出错的地方通常就是BUGS产生的地方。 由于内存处理而引起程序错误是最严重的错误; 内存错误是最难检测的; 1.内存泄漏 2.错误分配,包括大量增加 free()释放的内存和未初始化的引用 3.悬空指针 4.数组边界违规 这些错误是埋藏在内存空间中的地雷,静静地躺着,直到被某次运行所触发,导致程序发生故障或者崩溃,却无法准确定位问题。 这是一种非常令人不快的错误,但通常它们都隐藏得很好。 数组边界违规 数组边界违规十分危险,它是内存错误管理的最后一个主要类别。 char str[10]; strcpy(str,”hello,this is a string!”); 会发生什么情况?回答:难以预料,但是它可能与良好情形相差甚远。特别是,C 复制一个字符串,该字符串不适于为它分配的 10个字符。在任何常规实现中,“超过的”字符会覆盖内存中的其他数据。内存中数据分配的布局非常复杂并且难以再现,所以任何症状都不可能追溯到源代码级别的 具体错误。这些错误通常会导致数百万美元的损失。 1.内存泄漏 2.错误分配,包括大量增加 free()释放的内存和未初始化的引用 3.悬空指针 4.数组边界违规 标准C库函数是一个潜在的错误来源,因为它们很少检查操作对象的边界。如越界写缓冲区和使用没有null终止符的字符串。 // File: readovr2.c main() { char junk; char b[8], c[8]; strncpy(b, This is a test, sizeof(b)); memset(c, 0, sizeof(c)); printf(%sn, b); return (0); } 在这个例子中,虽然使用了strncpy以避免写出其缓冲区,但结果字符串b中并没有NULL结尾。 1.内存泄漏 2.错误分配,包括大量增加 free()释放的内存和未初始化的引用 3.悬空指针 4.数组边界违规 这是C/C++程序员经常遇到的问题: 操作NULL指针。 操作未初始化指针。 操作没有实际指向有效数据的指针。 试图比较不指向同一数据对象的指针。 试图通过没有实际指向函数的函数指针调用函数。 (请参见清单 1): //清单1. 未初始化的指针 void f2(int datum) { int *p2; /* Uh-oh! No one has initialized p2.
文档评论(0)