计算机等级考试 二级 C++实用技巧.pdf_第1页
计算机等级考试 二级 C++实用技巧.pdf_第2页
计算机等级考试 二级 C++实用技巧.pdf_第3页
计算机等级考试 二级 C++实用技巧.pdf_第4页
计算机等级考试 二级 C++实用技巧.pdf_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上学吧 第 1 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 C 实用技巧实用技巧 复杂的东西写多了 如今写点简单的好了 由于功能上的需要 Vczh Library 3 0 被我搞得很离谱 为了开发维护的遍历 减少粗心犯下 的错误以及增强单元测试 回归测试和测试工具 因此记录下一些开 发上的小技巧 以便抛砖引玉 造福他人 欢迎高手来喷 C 实谓各种语言中的软肋 功能强大 陷阱更强大 当然我认 为一门语言用得不好完全是程序员的责任 不过因为 C 涉及到的概 念实在是太多 想用好实在也不是一件容易的事情 C 开发的时候 总是会遇到各种各样的问题 其中最严重的无非是内存相关的 C 语 言由于结构简单 内存处理起来虽然不得力 但总的来说惯用法已经 深入人心 因此也不会造成什么很难发现的错误 C 就不一样了 有了虚函数 构造函数 析构函数 复制构造函数和 operator 重载之 后 还是有很多人喜欢把一个类直接写进文件流 或者拿来 memset 代码一团乱麻 不知悔改也 但是不能因此因噎废食 就像某人因为 C 带来的心智问题太多 自己搞不定 自己团队也搞不定 就说 C 不好一样 因此第一篇文章主要针对内存来讲 我们处理内存 第一件事就 是不要有内存泄露 内存泄露不能等到测试的时候 通过长时间运行 程序并观察任务管理器的方法来做 这显然已经晚了 幸好 Visual C 给了我们一个十分好用的工具 CrtDumpMemoryLeaks 函数 这 上学吧 第 2 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 个函数会在 Debug 模式下往 Visual Studio 的 output 窗口打印出那个 时候你 new malloc 了但是还没 delete free 的所有内存块的地址 长度 前 N 个字节的内容和其他信息 怎么做呢 其实很简单 1 define CRTDBG MAP ALLOC 2 include 3 include 4 include 5 6 int wmain vint argc wchar t args 7 8 这里运行程序 并在下面的函数调用之前 delete 掉所有 new 的东西 上学吧 第 3 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 9 CrtDumpMemoryLeaks 10 return 0 11 上一篇文章讲到了如何检查内存泄露 其实只要肯用 C 的 STL 里 面的高级功能的话 内存泄露是很容易避免的 我在开发 Vczh Library 3 0 的时候 所有的测试用例都保证跑完了没有内存泄露 但是很可惜有些 C 团队不能使用异常 更甚者不允许写构造函数析 构函数之类 前一个还好 后一个简直就是在用 C 当然有这些变态 规定的地方 STL 都是用不了的 所以我们更加需要扎实的基础来开 发 C 程序 今天这一篇主要还是讲指针的问题 因为上一篇文章一笔带过 今天就来详细讲内存泄漏或者野指针发生的各种情况 当然我不可能 一下子举出全部的例子 只能说一些常见的 一 错误覆盖内存 之前提到的不能随便乱 memset 其实就是为了避免这个问题的 其实 memcpy 也不能乱用 我们来看一个例子 最简单的 上学吧 第 4 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 1 define MAX STRING 20 2 3 struct Student 4 5 char name MAX STRING 6 char id MAX STRING 7 int chinese 8 int math 9 int english 10 上学吧 第 5 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 大家对这种结构肯定十分熟悉 毕竟是大学时候经常要写的作业 题 好了 大家很容易看得出来这其实是 C 语言的经典写法 我 们拿到手之后 一般会先初始化一下 然后赋值 1 Student vczh 2 memset 3 strcpy vczh name vczh 4 strcpy vczh id VCZH S ID 5 vczh chinese 70 6 vczh math 90 7 vczh english 80 为什么要在这里使用memset呢 memset的用处是将一段内存的 每一个字节都设置成同一个数字 这里是 0 因此两个字符串成员的 所有字节都会变成 0 因此在 memset 了 Student 之后 我们通过正常 上学吧 第 6 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 方法来访问 name 和 id 的时候都会得到空串 而且如果 Student 里面 有指针的话 0 指针代表的是没有指向任何有效对象 因此这个时候 对指针指向的对象进行读写就会立刻崩溃 对于其他数值 0 一般作 为初始值也不会有什么问题 double 什么的要小心 这就是我们写 程序的时候使用 memset 的原因 今天是关于内存的最后一篇了 上一篇文章讲了为什么不能对一个东 西随便 memset 里面的 demo 代码出了点小 bug 不过我不喜欢在发 文章的时候里面的 demo 代码也拿去编译和运行 所以大家有什么发 现的问题就评论吧 这样也便于后来的人不会受到误导 这次说的仍 然是构造函数和析构函数的事情 不过我们将通过亲手开发一个智能 指针的方法 知道引用计数如何帮助管理资源 以及错误使用引用计 数的情况 首先先来看一下智能指针是如何帮助我们管理内存的 现在智能 指针的实现非常多 我就假设这个类型叫 Ptr 吧 这跟 Vczh Library 3 0 所使用的实现一样 1 class Base 2 3 public 4 virtual Base 5 6 上学吧 第 7 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 7 class Derived1 public Base 8 9 10 11 class Derived2 public Base 12 13 14 15 16 17 List objects 18 objects Add new Derived1 19 objects Add new Derived2 20 21 List objects2 22 objects2 Add objects 0 当然这里的 List 也是 Vczh Library 3 0 实现的 不过这玩意儿 跟 vector 也好跟 C 的 List 也好都是一个概念 因此也就不需要多加 解释了 我们可以看到智能指针的一个好处 只要没有循环引用出现 你无论怎么复制它 最终总是可以被析构掉的 另一个例子告诉我们 智能指针如何处理类型转换 上学吧 第 8 页 共 8 页 上学吧为您提供 计算机等级考试 复习资料下载 1 Ptr d1 new Derived1 2 Ptr b d1 3 Ptr d2 b Cast 4 d2 是空 因为 b 指向的是 Derived1 而不是 Derived2 这就如同我们 Derived1 可以隐式转换到 Base 而当你使用 dynamic cast static cast new Derived1 会得到 0 一样 智能指针在帮 助我们析构对象的同时 也要做好类型转换的工作 好了 现在先让我们一步一步做出那个 Ptr 我们需要清楚这个 智能指针所要实现的功能是什么 然后我们一个一个来做 首先让我 们列出一张表 1 没有参数构造的时候 初始化为空 2 使用指针构造的时候 拥有那个指针 并且在没有任何智能 指针指向那个指针的时候删除掉该指针 3 智能指针进行复制的时候 两个智能指针共同拥有该内部

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论