新書推薦:
《
恶的哲学研究(社会思想丛书)
》
售價:NT$
500.0
《
当你沉默时(悬疑推理 反PUA 反家暴 女性独立小说,揭秘情感PUA的真相,女性自我救赎的文学典范)
》
售價:NT$
255.0
《
不止江湖
》
售價:NT$
449.0
《
天才留步!——从文艺复兴到新艺术运动(一本关于艺术天才的鲜活故事集,聚焦艺术史的高光时刻!)
》
售價:NT$
704.0
《
双城史
》
售價:NT$
505.0
《
冯友兰和青年谈心系列:不是问题的问题(哲学大师冯友兰和年轻人谈心,命运解读)
》
售價:NT$
254.0
《
月与蟹(青鲤文库)荣获第144届直木奖,天才推理作家经典作品全新译本。一部青春狂想曲,带你登上心理悬疑之巅。
》
售價:NT$
230.0
《
索恩丛书·盛清统治下的太监与皇帝
》
售價:NT$
403.0
編輯推薦:
获取处理10种不同类型的错误的秘诀,包括内存泄漏和未初始化的变量
发现C++从C所继承的问题,例如指针运算
在代码中插入临时或永久的安全检查,在运行时捕捉错误
应用缺陷预防技巧,例如用单独的类表示每种数据类型
在代码投入生产之前,追求一种一次捕捉和修正一个缺陷的测试策略
內容簡介:
当你使用C++进行编程时,很容易犯下各种各样的错误。有哪些常见的错误和陷阱?它们有什么一般的规律和特点?如何避免犯这样的错误?《C++编程调试秘笈》针对这些问题一一解答。
《C++编程调试秘笈》讨论了程序员在C++编程中所犯的一些最为常见的错误,并提供了避免这些错误的方法。C++社区积累了许多优秀的编程实践。在《C++编程调试秘笈》中,作者收集了其中的一些实践并对它们进行了调整和优化,此外,作者还增加了自己的一些有益的实践。
全书分为3个部分和10个附录。第一部分是前3章,以概括的方式介绍了C++调试的策略。第二部分包括第4章到第14章,逐个讨论C++代码中最为常见的错误类型,并为每种错误制定一种策略或规则。各章分别介绍了C++编程中数组、指针、引用、迭代器、变量、内存、NULL指针等相关的缺陷以及调试策略。第三部分包括第15章到第17章。第15章和第16章结合工具概括了调试策略,第17章是对全书内容的一个概括和总结。附录部分给出了《C++编程调试秘笈》所用到的库和一些程序文件的源代码。
《C++编程调试秘笈》要求读者有一定的C++编程基础或经验,适合C++的中级、高级程序员阅读。《C++编程调试秘笈》中介绍的缺陷捕捉策略和实践,能够帮助读者在C++编程实践中达到事半功倍的效果。
關於作者:
Vladimir
Kushnir获得了USSR科学院固体物理研究所的博士学位。毕业之后,他从事实验物理研究。在西北大学和阿贡国家实验室工作时,他先后所使用FORTRAN、C和C++d等编程语言。后来,他投身于华尔街的金融公司,把主要精力放在一种称为“金融分析”的计算上。他对于提升计算速度具有特别的浓厚的兴趣。译者徐波,C和C++专家,资深译者,翻译有《C专家编程》、《C和指针》等C语言经典之作,译本准确流程,备受好评。
目錄 :
第一部分 C++的缺陷捕捉策略
第1章 C++的缺陷来自哪里
第2章 什么时候捕捉缺陷
2.1 为什么编译器是捕捉缺陷的最好场合
2.2 怎样用编译器捕捉缺陷
2.3 处理类型的正确方式
第3章 在运行时遇见错误该怎么办
第二部分 捕捉缺陷:一次处理一个缺陷
第4章 索引越界
4.1 动态数组
4.2 静态数组
4.3 多维数组
第5章 指针运算
第6章 无效的指针、引用和迭代器
第7章 未初始化的变量
7.1 初始化的数值int、double等
7.2 未初始化的布尔值
第8章 内存泄漏
8.1 引用计数指针
8.2 作用域指针
8.3 用智能指针实行所有权
第9章 解引用NULL指针
第10章 拷贝构造函数和赋值操作符
第11章 避免在析构函数中编写代码
第12章 怎样编写一致的比较操作符
第13章 使用标准C函数库的错误
第三部分 捕捉缺陷的乐趣:从测试到调试到产品
第14章 基本的测试原则
第15章 调试错误的策略
第16章 使代码更容易调试
第17章 总结
附录A 本书所使用的scpp库的源代码
附录B scpp_assert.hpp和scpp_assert.cpp文件的源代码
附录C scpp_vector.hpp文件的源代码
附录D scpp_array.hpp文件的源代码
附录E scpp_matrix.hpp文件的源代码
附录F scpp_types.hpp文件的源代码
附录G scpp_refcountptr.hpp文件的源代码
附录H scpp_scopedptr.hpp文件的源代码
附录I scpp_ptr.hpp文件的源代码
附录J scpp_date.hpp和scpp_date.cpp文件的源代码
內容試閱 :
第一部分
C++的缺陷捕捉策略
本书第一部分对可能潜入到C++程序中的各种错误进行了分类。我们描述了在编译时而不是在测试时捕捉错误的价值所在,并提出了一些基本原则。当我们寻找特定的技巧以防止或捕捉后面章节所讨论的缺陷时,就需要记住这些原则。
第1章
C++的缺陷来自哪里
C++语言是非常独特的。虽然实际上所有的编程语言都从其他语言中吸收了一些思路、语法元素和关键字,C++却是吸收了另一种完整的语言,即C语言。事实上,C++语言的创建者Bjarne
Stroustrup原先把他的新语言命名为“带类的C”。这意味着如果我们已经使用了一些C代码,并且由于某种原因(例如科研或贸易)切换到一种面向对象的语言,就不需要在移植代码方面采取任何措施,只要安装新的C++编译器,就可以对旧的C代码进行编译了,并且效果和原先的一模一样。我们甚至会觉得已经完成了从C到C++的转换。最后这种想法虽然距离真相还很远,用真正的C++所编写的代码与C代码看上去存在很明显的区别,但它还是提供了一个逐渐过渡的选项。也就是说,我们可以从现在编译运行的C代码出发,逐渐引入用C++所编写的新代码段,慢慢与它们混合在一起,最终实现到纯C++的切换。因此,C++的层次式设计具有它独特的市场推动力。
但是,其中还是存在一些复杂的地方:随着C的完整语法被新语言完整地吸收,它的设计哲学和存在的问题也同样被吸收。C语言是在1969年~1973年期间由Dennis
Rithie在贝尔实验室创建的,其出发点是为了编写Unix操作系统。这项工作的一个伴随成果是诞生了一种高效的高级编程语言(与需要编写每条计算机指令的汇编语言相比)。也就是说,它所产生的编译后的代码应该具有尽可能快的速度。这种新的C语言的其中一项公开原则是,用户不应该为他没有使用到的特性而受到拖累。因此,为了追求高效的编译代码,对于程序员没有提出明确的要求,C就绝对不会加以考虑。C语言是为了速度而不是为了舒适而创建的,这就产生了一些问题。
首先,程序员可以创建一个某种长度的数组,并用一个超出该数组边界的索引值访问一个元素。更容易被滥用的是C的指针运算,程序员可以把指针运算所产生的任何值作为内存地址并对它进行访问,不管这块内存是否应该被访问。(实际上,这两个问题其实是同一个,只不过使用了不同的语法。)
程序员还可以在运行时使用calloc和malloc函数动态分配内存,并使用free函数负责动态内存的销毁。但是,如果忘了销毁或者不小心销毁了多次,其结果可能是灾难性的。
我们将在本书的第二部分深入讨论这些问题中的每一个。需要重视的是,C++在继承整个C时,除了传承它的高效原则,还继承了它的所有问题。因此,C++代码中的部分缺陷就来源于C。
但是,故事并没有结束。除了来自于C的问题,C++自身也存在一些问题。例如,大多数人认为友函数和多重继承并不是良好的编程思路。C++具有自己分配内存的方法,它并不是调用像calloc或malloc这样的函数,而是使用操作符new。new操作符并不仅仅分配内存,它还创建对象,即调用它们的构造函数。与C的精神相同,使用delete操作符删除动态分配的内存是程序员的责任。现在的情况看起来与C相同:我们分配了一些内存,然后删除它。但是,复杂之处在于C++具有两种不同的new操作符:
在第一种情况下,new操作符创建了一个MyClass类型的对象。在第二种情况下,它创建了一个相同类型的对象数组。与之对应的是,C++具有两种不同的delete操作符:
当然,一旦使用了“带方括号的new”创建对象,就需要使用“带方括号的delete”删除它们。这样就可能导致一种新的错误:混用new和delete,其中一个带了方括号而另一个没有带方括号。如果出现了这种错误,就会对内存堆产生巨大的破坏。因此,我们可以总结如下:C++的缺陷大部分来源于C,但C++也引入了一些自讨苦吃的新方法。我们将在本书的第二部分讨论这些话题。