C++ 程序问题检查
2015-12-25 17:15
295 查看
1、死循环问题
逻辑死循环
while循环continue循环变量没有递增
循环变量用串了
解决方案:循环计数,超过一定次数跳出
2、内存异常
1.格式化字符串类型不匹配造成崩溃问题
2.字串函数传入空指针会崩溃串连接
3.结构体成员,包含std::string 里边有如果长度超过16个字节,就会分配堆上的内存,这个内存跨进程肯定就失效了。
所有在包含带有构造函数的对象结构体时候,如果有堆内存分配,直接进行memcpy是不符合规范的。所以这接口在copy结构体时候,结构体类型只能包含基本数据类型。
4.Memset函数会 直接破坏了构造函数执行的初始化过程。这个会造成无法预料的错误。
3、迭代器异常
迭代器遍历过程中,又对迭代器指向的数据进行删除与插入操作。这个在客户端程序出现过很多次,因为服务器一半运行过程种不进行自定义数据插入,这个问题出现比较少。
1.迭代器执行过程中调用的函数里内部不允许给迭代器指向的对象插入删除数据。
2.增加备份,直接复制一份数据,执行的时候用复制数据进行。
4.内存泄露检查
bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
5、内存工具
UMDH.exe来查内存泄露 ,这个工具分析两个时间点堆栈情况,所有两个点内存分配的堆栈都会打印出来
Windbg 是微软调试工具,如果用熟练的话,可以用!heap命令查看所有进程分配的堆
6、性能工具
VTune Amplifier XE 2013、
Windows 自带的CPU内存监控Performance monitor
7、流量问题
消息统计 分析消息文件,找出流量热点,然后编码解决
8、代码检查工具
PC-lint,使用比较复杂,我一般使用的时候关闭所有其他选项只检查某一下,比如除0,switch case 忘记break,表达式异常,还是有不错效果的,有时候手误肉眼看不出来。
Astyle 开源的代码格式化工具,通过配置可以生成符合公司规范的代码。
注意linux与windows代码移植
注意文件名的大小写,linux操作系统区分名字大小写
2.同一模块下目录下,不要有同名文件,或者无用文件,这个应该是make文件问题.
3.源代码文件cpp,h的结尾要有空行,不然警告很烦。
4.#include 包含头文件的时候一定要注意文件名的大小写, VC++大小写都无所谓,但是
linux下就通不过。
5.文件的路径分隔推荐使用 " / ", 而不是 " \\ ", 反斜杠linux与windows系统都可以使用,
双正斜杠只有WINDOWS平台支持.
6.避免使用windows定义的类型DWORD BYTE BOOL FALSE TRUE 等等。尽可能使用c++内建的基本的数据类型与游戏引擎支持的数据类型
7.函数的调用方式前边的下划线,在windows长短都可以,但是在linux下必须是长下划线_cdecl无法通过编译,必须是__cdecl __stdcall
8. itoa要改写sprintf() linux没有itoa函数。
9.宽字符处理函数要包含#include <wchar.h>
10. or不能当做标示符使用,linux编译通不过,应该与关键字冲突。
11.标准库模板嵌套定义的时候,如果连个尖括号挨一起,中间要加空格 map<type,vector<type>> 要改成map<type,vector<type> >最好改成
map< type , vector< type > >这样比较美观。
12.注意源文件格式(cpp,h)保存的格式统一为(简体中文(GB2312) — 代码页936)不然会有莫名的错误。
14.在函数体内部定义的结构体会产程编译报错
15.尽量少用与平台相关的API 比如目录管理API,线程同步API。
逻辑死循环
while循环continue循环变量没有递增
循环变量用串了
解决方案:循环计数,超过一定次数跳出
2、内存异常
1.格式化字符串类型不匹配造成崩溃问题
2.字串函数传入空指针会崩溃串连接
3.结构体成员,包含std::string 里边有如果长度超过16个字节,就会分配堆上的内存,这个内存跨进程肯定就失效了。
所有在包含带有构造函数的对象结构体时候,如果有堆内存分配,直接进行memcpy是不符合规范的。所以这接口在copy结构体时候,结构体类型只能包含基本数据类型。
4.Memset函数会 直接破坏了构造函数执行的初始化过程。这个会造成无法预料的错误。
3、迭代器异常
迭代器遍历过程中,又对迭代器指向的数据进行删除与插入操作。这个在客户端程序出现过很多次,因为服务器一半运行过程种不进行自定义数据插入,这个问题出现比较少。
1.迭代器执行过程中调用的函数里内部不允许给迭代器指向的对象插入删除数据。
2.增加备份,直接复制一份数据,执行的时候用复制数据进行。
4.内存泄露检查
bool WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
5、内存工具
UMDH.exe来查内存泄露 ,这个工具分析两个时间点堆栈情况,所有两个点内存分配的堆栈都会打印出来
Windbg 是微软调试工具,如果用熟练的话,可以用!heap命令查看所有进程分配的堆
6、性能工具
VTune Amplifier XE 2013、
Windows 自带的CPU内存监控Performance monitor
7、流量问题
消息统计 分析消息文件,找出流量热点,然后编码解决
8、代码检查工具
PC-lint,使用比较复杂,我一般使用的时候关闭所有其他选项只检查某一下,比如除0,switch case 忘记break,表达式异常,还是有不错效果的,有时候手误肉眼看不出来。
Astyle 开源的代码格式化工具,通过配置可以生成符合公司规范的代码。
注意linux与windows代码移植
注意文件名的大小写,linux操作系统区分名字大小写
2.同一模块下目录下,不要有同名文件,或者无用文件,这个应该是make文件问题.
3.源代码文件cpp,h的结尾要有空行,不然警告很烦。
4.#include 包含头文件的时候一定要注意文件名的大小写, VC++大小写都无所谓,但是
linux下就通不过。
5.文件的路径分隔推荐使用 " / ", 而不是 " \\ ", 反斜杠linux与windows系统都可以使用,
双正斜杠只有WINDOWS平台支持.
6.避免使用windows定义的类型DWORD BYTE BOOL FALSE TRUE 等等。尽可能使用c++内建的基本的数据类型与游戏引擎支持的数据类型
7.函数的调用方式前边的下划线,在windows长短都可以,但是在linux下必须是长下划线_cdecl无法通过编译,必须是__cdecl __stdcall
8. itoa要改写sprintf() linux没有itoa函数。
9.宽字符处理函数要包含#include <wchar.h>
10. or不能当做标示符使用,linux编译通不过,应该与关键字冲突。
11.标准库模板嵌套定义的时候,如果连个尖括号挨一起,中间要加空格 map<type,vector<type>> 要改成map<type,vector<type> >最好改成
map< type , vector< type > >这样比较美观。
12.注意源文件格式(cpp,h)保存的格式统一为(简体中文(GB2312) — 代码页936)不然会有莫名的错误。
14.在函数体内部定义的结构体会产程编译报错
15.尽量少用与平台相关的API 比如目录管理API,线程同步API。
相关文章推荐
- C++学习:动态内存分配
- 【转】话说C语言const用法
- C++ 为什么要virtual析构函数
- C++学习:const关键字和常量
- C++代码优化
- C++ 函数指针
- C++小题(三)
- C++实现大数除法
- 【转】C语言中内存分配
- C++标准库--cctype
- 如何用C语言画一个“圣诞树”
- 函数模板与类模板的简单实例
- VS2013 C++ Unicode环境下 BYTE 数组转CString的方法
- C++ 11 在 Qt 5 中的应用
- android bionic (Android的C/C++调用库)目录结构
- c++视频编辑代码小结
- C++了解2
- 《C++Primer 5e》学习笔记(2):字符串、向量和数组
- C语言宏定义##连接符和#符的使用
- C/C++面试题精选