VC常见错误分析与代码改进.pptVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VC常见错误分析与代码改进.ppt

VC常见错误分析与代码改进 余明 Q Q:183832091 E-Mail:yuming98@ BLOG:/manfish 示例: char *GetName() { char Name[]=“Yu.Ming”; return Name; } 分析: 局部变量Name在函数返回之后已经失效,堆栈中内容处于不确定状态 千万不要返回局部对象的引用 示例: char *GetName() { char *pName= new char[10]; Strcpy(pName,“Yu.Ming”); return pName; } 分析: 调用者很容易忘记对pName的资源释放 尽量用“传引用”而不用“传值” 问题1:对象传递会导致构造函数调用、内存分配等一系列开销,导致效率下降 问题2:容易导致对象切割(见下页)。 如果对象是内置类型(如int),传值效率更高 STL的迭代器和函数对象,传值方式也较适当 class Window{ public: std::string name() const; //返回窗口名称 virtual void display() const; //显示窗口和其内容 }; class WindowWithScrollBars: public Window { public: virtual void display() const; }; // 一个受“切割问题”困扰的函数 void printNameAndDisplay(Window w){ cout (); w.display(); } //想象当用一个WindowWithScrollBars对象来调用这个函数时将发生什么: WindowWithScrollBars wwsb; printNameAndDisplay(wwsb); 分析:参数 wwsb 将会作为一个 Windows 对象而被创建,而不是WindowWithScrollBars 对象 示例: string *stringarray = new string[100]; ... delete stringarray; 分析:实际上还有99个对象没有delete 正确写法:delete []stringarray; 示例: CString str; GetDlgItemText (hDlg,nIDDlgItem,str.GetBuffer(200),200); str.Release(); 分析: 由GetBuffer申请一块内存长度,Release结束内存不稳定状态 改进的临界资源类 示例: #pragma once 分析: 在头文件的顶行书写,可以避免头文件交叉引用时的嵌套引用。 结构对齐问题(1) 示例: struct _MyStruct{ char flag; char *p; }MyStruct; MyStruct M1; int k = sizeof(M1); //k=? K在编译器缺省状态下值为8而不是5 结构对齐问题(2) 改进办法: #pragma pack(1) //强制按1字节对齐 struct _MyStruct{ char flag; char *p; }MyStruct; #pragma pack() //恢复原有设置 VC7工程配置: 项目属性-C/C++-代码生成-结构成员对齐 与第三方通讯、开发通用库等情况下,建议按1字节对齐 屏蔽已知警告 #pragma warning( disable: 4244 ) //4244是类型转换警告,从大数转为小数时产生(如long到short时) //出现警告的代码段 #pragma warning( default: 4244 ) 警告号可以通过编译器输出信息来查看,以类似于下行所示形式存在: warning C4244: “参数” : 从“LPARAM”转换到“int”,可能丢失数据 条件编译示例 #define USES_DEBUGDATA #ifdef USES_DEBUGDATA //代码段1,定义USES_DEBUGDATA时编译此段 #else //代码段2,没定义USES_DEBUGDATA时编译此段 #endif 支持VC6和VC7的自定义消息示例 以CTWDCMainDlg类添加UWM_SYSTEMMSG消息为例 头文件定义消息ID和响应接口: #define UWM_SYSTEMMSG (WM_USER + 1000) //消息ID应大于WM_USER afx_msg LR

文档评论(0)

天马行空 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档