互联网
类型
6.2
豆瓣评分
可以朗读
语音朗读
107千字
字数
2013-09-01
发行日期
展开全部
主编推荐语
为你成为C和C++高手、编写出完美的程序助一臂之力。
内容简介
C/C++是广泛用于系统和应用软件开发的语言,也是使用最为广泛的编程语言。C/C++易学难用,尤其C++,经过20多年的发展,已经变得非常复杂,给编程人员带来了很大的挑战。那么如何在工程项目中用好C/C++语言、如何绕过Bug构建稳定可靠的生产系统、如何以最快速度全面了解C/C++编程中的陷阱和障碍,编写出健壮可靠的代码呢?《从缺陷中学习C/C++》将通过102个案例,帮助程序员尽快从新手成长为专家。案例涵盖基础问题、编译问题、库函数问题、文件处理、类和对象、内存使用、多线程问题、性能问题等。读者每掌握一个案例就掌握了一个或几个知识点,就能避免一类问题。由于是从大量编程中总结出来的具体Bug案例中学习,这种学习方式更直接,让人印象更深刻。
目录
- 版权信息
- 内容提要
- 本书作者
- 致谢
- 序
- 前言
- 第1章 基础问题
- 1.1 运算符优先级引起的问题
- 1.2 不加括号的宏定义引起的错误
- 1.3 污染环境的宏定义
- 1.4 多语句宏定义使用错误
- 1.5 char转为int时高位符号扩展的问题
- 1.6 int转为char时的数据损失
- 1.7 非法的数组下标
- 1.8 有符号int与无符号int比较的后果
- 1.9 有符号的困惑
- 1.10 整除的精度问题
- 1.11 浮点数比较的精度问题
- 1.12 最小负整数取相反数溢出
- 1.13 临时变量溢出
- 1.14 size_t导致的死循环
- 1.15 误用short引起缓冲区溢出
- 1.16 区分continue和return
- 1.17 指针常量和常量指针的区别
- 1.18 字符数组和指针不总是等价的
- 1.19 结构体成员变量初始化的隐患
- 1.20 返回值非void的函数没有返回值
- 1.21 cin>>和getline混用导致的奇怪问题
- 1.22 小结
- 第2章 编译问题
- 2.1 动态链接库加载错误版本
- 2.2 相同名称静态库的链接顺序
- 2.3 使用命名空间来区分不同cpp中的同名类
- 2.4 C++模板编译时依赖名称查找
- 2.5 违背ODR原则可能会带来的意想不到的问题
- 2.6 变量共用内存时使用O2优化编译
- 2.7 小结
- 第3章 库函数问题
- 3.1 sprintf函数引起的缓冲区溢出
- 3.2 snprintf函数format参数的问题
- 3.3 错误使用snprintf函数返回值
- 3.4 字符串复制不完整
- 3.5 string类的c_str方法使用不当
- 3.6 string类的“[]”操作符使用不正确
- 3.7 不正确的字符串比较
- 3.8 strncpy函数没有复制结束符
- 3.9 调用memcpy函数前未初始化缓冲区
- 3.10 误用sizeof操作符取字符串长度
- 3.11 string类find函数返回值判定
- 3.12 stringstream的清空
- 3.13 调用strptime函数前需初始化tm
- 3.14 使用feof函数的陷阱
- 3.15 for循环中调用vector容器insert函数
- 3.16 multiset容器erase函数的误用
- 3.17 慎用容器类erase函数的返回值
- 3.18 for循环中调用vector容器erase函数
- 3.19 getopt函数参数问题
- 3.20 不用errno判断系统调用是否成功
- 3.21 strcat函数造成的段错误
- 3.22 危险的strdup函数
- 3.23 小结
- 第4章 文件处理
- 4.1 程序异常退出时未关闭已打开文件
- 4.2 目录打开后未关闭
- 4.3 写文件没有调用fflush
- 4.4 读文件fread的返回值不能忽略
- 4.5 getline()使用不当导致的死循环
- 4.6 未重置流状态导致读文件错误
- 4.7 小结
- 第5章 类和对象
- 5.1 对象的浅复制
- 5.2 构造函数中的操作符重载
- 5.3 拷贝构造函数不能模板化
- 5.4 析构函数未捕获异常引发coredump
- 5.5 构造函数中抛出异常引起内存泄露
- 5.6 多态性未生效
- 5.7 基类成员函数被隐藏
- 5.8 匿名对象引起的内存泄露
- 5.9 基类非虚析构函数引发内存泄露
- 5.10 删除void*指针引发内存泄露
- 5.11 STL容器不会自动释放指针指向的对象
- 5.12 静态成员类内初始化
- 5.13 union作为类的成员时需要构造函数
- 5.14 成员函数尾部缺失const标注
- 5.15 使用memset初始化class
- 5.16 dynamic_cast转换失败返回NULL
- 5.17 小结
- 第6章 内存使用
- 6.1 数组越界
- 6.2 数组定义和值初始化形式混淆
- 6.3 数组传参时的sizeof
- 6.4 临时对象的生存期
- 6.5 变量的作用域
- 6.6 指针变量的传值和传址
- 6.7 指针赋值和指针赋址的混淆
- 6.8 指针释放后再次使用
- 6.9 重复申请内存未释放
- 6.10 delete与delete[]的区别
- 6.11 函数中途退出忘记释放内存
- 6.12 二维数组的内存泄露
- 6.13 临时变量内存不能返回
- 6.14 正确使用引用参数和引用返回值
- 6.15 试图产生的指针很可能不存在
- 6.16 结构体成员内存对齐问题
- 6.17 String对象何时需delete
- 6.18 小结
- 第7章 多线程问题
- 7.1 局部静态变量非线程安全
- 7.2 string类append操作非线程安全
- 7.3 中途退出造成的线程阻塞
- 7.4 结构体位域成员线程安全问题
- 7.5 多线程写文件引发内容被覆盖
- 7.6 线程未join引起的内存泄露
- 7.7 小结
- 第8章 性能问题
- 8.1 strlen用作循环条件影响性能
- 8.2 STL容器list使用时忌频繁调用size()
- 8.3 误用clear回收vector内存
- 8.4 calloc在glibc高版本下性能劣于低版本下
- 8.5 小结
- 第9章 C/C++编程中其他问题
- 9.1 中文截断成乱码
- 9.2 不必要的类型转换
- 9.3 不确定的函数参数赋值
- 9.4 epoll边沿触发模式下的陷阱
- 9.5 小结
展开全部
出版方
人民邮电出版社
人民邮电出版社是工业和信息化部主管的大型专业出版社,成立于1953年10月1日。人民邮电出版社坚持“立足信息产业、面向现代社会、传播科学知识、服务科教兴国”,致力于通信、计算机、电子技术、教材、少儿、经管、摄影、集邮、旅游、心理学等领域的专业图书出版。