C++程序设计ch13 程序设计的防错.ppt

上传人:豆**** 文档编号:87434324 上传时间:2023-04-16 格式:PPT 页数:42 大小:485.50KB
返回 下载 相关 举报
C++程序设计ch13 程序设计的防错.ppt_第1页
第1页 / 共42页
C++程序设计ch13 程序设计的防错.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《C++程序设计ch13 程序设计的防错.ppt》由会员分享,可在线阅读,更多相关《C++程序设计ch13 程序设计的防错.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C+程序设计ch13程序设计的防错本课主要内容本课主要内容n保证程序的正确性保证程序的正确性n异常异常n函数的防错函数的防错n测试测试n调试调试11.4如何减少错误如何减少错误n一般原则一般原则l通过良好的代码组织减少错误,减小错误的影响范围通过良好的代码组织减少错误,减小错误的影响范围(充分利充分利用函数和类实现封装,如果出现错误,尽量把错误的范围限用函数和类实现封装,如果出现错误,尽量把错误的范围限制在封装的范围内,不波及到程序的其它部分制在封装的范围内,不波及到程序的其它部分)l通过调试和测试消除错误。通过调试和测试消除错误。n通过以上方法尽量减少错误,并使得未发现和未纠正通过以上方法尽

2、量减少错误,并使得未发现和未纠正的错误不会严重影响程序的正常运行。的错误不会严重影响程序的正常运行。n编写正确的程序虽然需要大量的实践经验,但是从一编写正确的程序虽然需要大量的实践经验,但是从一开始就进行良好的训练更重要。开始就进行良好的训练更重要。52解决错误解决错误n解决编译错误解决编译错误l编译错一般都是语法错误,比如编译错一般都是语法错误,比如:写掉了行尾的写掉了行尾的;号号把英文的把英文的;号写成了汉字的;号号写成了汉字的;号括号没有配对括号没有配对类型名称,变量名称,函数名称,头文件名称键入错了等等。类型名称,变量名称,函数名称,头文件名称键入错了等等。l一般情况下,编译器给出的编

3、译错误都是描述性的,根据其一般情况下,编译器给出的编译错误都是描述性的,根据其描述的内容查找到指定的代码行纠正语法错误就可以了。描述的内容查找到指定的代码行纠正语法错误就可以了。l一般总是先解决第一个编译错指定的代码行,然后再编译。一般总是先解决第一个编译错指定的代码行,然后再编译。如果还有编译错,以此循环,直至消除全部编译错。如果还有编译错,以此循环,直至消除全部编译错。2解决错误解决错误n解决链接错误解决链接错误l链接错误的原因很少,一般就链接错误的原因很少,一般就3种情况:种情况:函数定义和函数声明不对应函数定义和函数声明不对应(一般是因为函数名键一般是因为函数名键入错了入错了)全局变量

4、进行了声明和使用,但没有定义全局变量进行了声明和使用,但没有定义(前面加前面加extern是全局变量的声明,而不是定义是全局变量的声明,而不是定义)没有链接需要的库没有链接需要的库(标准库是自动链接的,但其它标准库是自动链接的,但其它的库,比如提供网络通信功能的库就需要告诉的库,比如提供网络通信功能的库就需要告诉IDE库的名称和路径才能实现链接库的名称和路径才能实现链接)2解决错误解决错误n解决运行时错误解决运行时错误l通过一套完整的错误检查,报告与处理机制通过一套完整的错误检查,报告与处理机制来解决运行时错误来解决运行时错误n解决逻辑错误解决逻辑错误l通过调试和测试手段来解决逻辑错误通过调试

5、和测试手段来解决逻辑错误3函数的防错设计函数的防错设计n函数设计的基本原则:函数设计的基本原则:函数负责检查和报告错误;函数负责检查和报告错误;函数的调用者负责处理错误函数的调用者负责处理错误n报告错误的报告错误的4种方式种方式l函数的返回值函数的返回值l全局的错误变量;全局的错误变量;lassert宏宏l异常异常93.1报告错误报告错误(Error report)n通过返回值报告错误通过返回值报告错误l返回整型和指针类型的函数可以通过返回值返回整型和指针类型的函数可以通过返回值报告错误报告错误整型返回值整型返回值返回负数表示函数执行中出现了运行时错误,不能返回负数表示函数执行中出现了运行时错

6、误,不能得到预期的结果。得到预期的结果。各种负返回值应该定义为符号常量或各种负返回值应该定义为符号常量或const常量。常量。指针返回值指针返回值返回空指针表示函数执行中遇到了错误或没有执行返回空指针表示函数执行中遇到了错误或没有执行函数功能。函数功能。103.1报告错误报告错误(Error report)示例:示例:Page 11constintTheFirstError=-1;constintTheSecondError=-2;constintTheThirdError=-3;.intFunc(argumentlist).if(.)returnTheFirstError;.if(.)ret

7、urnTheSecondError;.return0;3.1报告错误报告错误(Error report)n通过全局的错误变量通过全局的错误变量l浮点型的返回值浮点型的返回值任何一个浮点型的值都是合法的结果,找不到一个可以表示函数执任何一个浮点型的值都是合法的结果,找不到一个可以表示函数执行错误的值作为返回值。行错误的值作为返回值。使用全局的使用全局的errno变量报告函数执行出现运行时错误。变量报告函数执行出现运行时错误。l全局变量全局变量errnoC标准库的头文件标准库的头文件中声明了一个全局变量中声明了一个全局变量errno存储错存储错误代码。误代码。一些库函数通过给一些库函数通过给err

8、no赋值来产生函数执行出错的信号。在调用赋值来产生函数执行出错的信号。在调用函数后,可以检查函数后,可以检查errno的值是否为的值是否为0检查函数执行是否正常。检查函数执行是否正常。在调用前需要将在调用前需要将errno清清0,因为这是一个全局变量,函数只管修,因为这是一个全局变量,函数只管修改它的值,而不管复原它。改它的值,而不管复原它。123.1报告错误报告错误(Error report)Page 13errno=0;y=sqrt(x);if(errno!=0)fprintf(stderr,sqrterror,programterminated.n);exit(-1);也可以执行也可以执

9、行perror函数输出错误信息,该函数原型为函数输出错误信息,该函数原型为voidperror(constchar*);该函数向标准错误流输出该函数向标准错误流输出参数字符串参数字符串一个分号一个分号一个空格一个空格最后是最后是errno相关的错误信息相关的错误信息errno=0;y=sqrt(x);if(errno!=0)perror(sqrterror);exit(-1);自定义的函数也可以使用这个全局变量并定义自己的错误码。自定义的函数也可以使用这个全局变量并定义自己的错误码。3.1报告错误报告错误(Error report)n通过通过assert宏宏assert宏声明在宏声明在中中(C

10、+是是)其原型为其原型为voidassert(intexpression);带一个参数,这个参数是一个正常情况一定为真的表达式。带一个参数,这个参数是一个正常情况一定为真的表达式。每每次次执执行行到到这这个个函函数数,就就检检查查参参数数表表达达式式的的值值,如如果果该该值值为为假假(0),则则向向stderr输输出出一一行行错错误误信信息息,并并调调用用abort函函数数终终止止程程序序执执行。显示的错误信息包括参数表达式,源文件名和代码行号。如:行。显示的错误信息包括参数表达式,源文件名和代码行号。如:char*p=newcharN+1;assert(p);该代码保证该代码保证p不为空。不

11、为空。143.1报告错误报告错误(Error report)n通过异常报告错误通过异常报告错误lC+中,如果函数执行过程中发生错误,则中,如果函数执行过程中发生错误,则在发生错误的地方抛出一个在发生错误的地方抛出一个异常异常(throw exception),函数不再往下执行。,函数不再往下执行。l函数的调用者通过函数的调用者通过try-catch块捕获可能发生块捕获可能发生的异常并进行相应处理。的异常并进行相应处理。15tryvectorv;intx;while(cinx)v.push_back(x);for(inti=0;i=v.size();+i)coutvi=viendl;catch(

12、constout_of_range&e)cerrOops!Rangeerror.n;return-1;catch(.)cerrOops!Unknownexception.n;return-2;163.1报告错误报告错误(Error report)n使用哪种方式报告错误使用哪种方式报告错误l一般的区分原则是:一般的区分原则是:函数返回值表示函数执行过程中可以预见到的不正常情况,比如文件函数返回值表示函数执行过程中可以预见到的不正常情况,比如文件打不开,数据库连不上,给打不开,数据库连不上,给sqrt一个负数参数等等。一个负数参数等等。errno只是函数只是函数返回值的替代方案返回值的替代方案(找

13、不到一个合适的返回值表示错误找不到一个合适的返回值表示错误)assert用于检查完全不应该发生的情况用于检查完全不应该发生的情况(比如给指针参数提供一个空比如给指针参数提供一个空指针指针)assert宏只用于调试版本,而在发行版本中不起作用宏只用于调试版本,而在发行版本中不起作用assert宏实际上是用来防止程序中出现的宏实际上是用来防止程序中出现的bug。异常主要用于编程时无法预见的运行时错误。如网络连接中断,硬盘异常主要用于编程时无法预见的运行时错误。如网络连接中断,硬盘耗尽等。耗尽等。l以上原则并不是强制性的,以上原则并不是强制性的,4种方法都可以用。种方法都可以用。一般一般C程序习惯用

14、前程序习惯用前3种种C+程序习惯用后程序习惯用后2种,并且以抛出异常为主要的错误报告方式,返种,并且以抛出异常为主要的错误报告方式,返回值只在函数正常执行完成时才有用。回值只在函数正常执行完成时才有用。173.2函数的前置条件与后置条件函数的前置条件与后置条件n每个函数总是包含输入,处理和输出每个函数总是包含输入,处理和输出3个个部分。部分。n函数对输入参数的正确性要求称为函数的函数对输入参数的正确性要求称为函数的前置条件前置条件(pre-conditions)。n函数成功执行后产生的结果称为函数成功执行后产生的结果称为后置条件后置条件(post-conditions)。n函数的前置和后置条件

15、都应该在函数首部函数的前置和后置条件都应该在函数首部的注释中写明。的注释中写明。183.2函数的前置条件与后置条件函数的前置条件与后置条件n前置条件前置条件l前置条件反映函数的输入参数的要求。如果前置条件反映函数的输入参数的要求。如果输入参数不满足要求,建议采用输入参数不满足要求,建议采用assert宏或宏或抛出异常的方式报告错误。抛出异常的方式报告错误。用用assert宏:宏:voidmy_strcpy(char*dest,constchar*src)assert(dest&src);while(*dest+=*src+);193.2函数的前置条件与后置条件函数的前置条件与后置条件n前置条件

16、前置条件用异常:用异常:doublearea(doublea,doubleb,doublec)if(a0|b0|cc&a+cb&b+ca)throwinvalid_argument(不是一个三角形不是一个三角形);doubles=(a+b+c)/2.0;doublearea=sqrt(s*(s-a)*(s-b)*(s-c);returnarea;203.2函数的前置条件与后置条件函数的前置条件与后置条件n后置条件后置条件l后置条件描述函数成功执行后的结果。后置条件描述函数成功执行后的结果。l如果函数只通过返回值返回,则应当描述这个返回值。如果函数只通过返回值返回,则应当描述这个返回值。l如果函

17、数还通过参数返回值,要描述对参数的修改内容。如果函数还通过参数返回值,要描述对参数的修改内容。如阶梯型电阻电路示例:如阶梯型电阻电路示例:voidgetResists(doublers,intrs_num)函数的后置条件就是函数的后置条件就是接收用户输入,向电阻值数组中填充接收用户输入,向电阻值数组中填充rs_num个电阻值,每个电阻值都大于个电阻值,每个电阻值都大于0。又如冒泡排序示例:又如冒泡排序示例:templatevoidBubbleSort(vector&)其后置条件是其后置条件是对类型为对类型为T的向量进行冒泡排序,最小的元素在前,最大的元素在后。的向量进行冒泡排序,最小的元素在前

18、,最大的元素在后。214 异常异常n4.1 异常的作用异常的作用l函数防错的基本原则是函数负责检测和报告函数防错的基本原则是函数负责检测和报告错误,调用函数处理错误错误,调用函数处理错误 lC语言通常使用返回值和全局错误变量的方语言通常使用返回值和全局错误变量的方法,工业强度级的软件系统,每调用一个函法,工业强度级的软件系统,每调用一个函数都要在后面跟上一大堆数都要在后面跟上一大堆if-elseif-else语句来语句来检测调用过程中是否出现了错误,过多的错检测调用过程中是否出现了错误,过多的错误处理代码常常淹没了真正起核心作用的业误处理代码常常淹没了真正起核心作用的业务函数的调用代码务函数的

19、调用代码 lC+通过引入异常机制,通过引入异常机制,将正常调用函数和将正常调用函数和对错误进行处理的代码严格分开对错误进行处理的代码严格分开,提高了程,提高了程序的可读性和可维护性序的可读性和可维护性 4.1 异常的作用异常的作用n函数抛出异常函数抛出异常 l函数负责检测和报告异常。函数负责检测和报告异常。l当函数中出现异常后,由函数抛出异常。当函数中出现异常后,由函数抛出异常。n抛出异常的语法:抛出异常的语法:throwexpr;4.1 异常的作用异常的作用抛出异常的过程:构造一个异常类的变量,然后抛出。构造一个异常类的变量,然后抛出。if(a0|b0|c0)throwinvalid_arg

20、ument(边长不能为负边长不能为负);这是一个简写的形式,完整的代码可以如下:这是一个简写的形式,完整的代码可以如下:if(a0|b0|c0)invalid_argumenterror(边长不能为负边长不能为负);throwerror;invalid_argument是标准库定义的标准异常类,其构造函数是标准库定义的标准异常类,其构造函数带有一个参数,表示出错信息。带有一个参数,表示出错信息。4.1 异常的作用异常的作用n抛出异常以后抛出异常以后l函数中,执行到抛出异常的语句就和执行到函数中,执行到抛出异常的语句就和执行到return语句一样,函数出栈,所有局部变量析语句一样,函数出栈,所有

21、局部变量析构,如果函数中动态分配了内存或其它资源构,如果函数中动态分配了内存或其它资源没有释放就会产生内存泄漏没有释放就会产生内存泄漏 C+编程建议,类应该在构造函数中动态分配内编程建议,类应该在构造函数中动态分配内存或资源,在析构函数中释放存或资源,在析构函数中释放 l函数抛出异常出栈以后,与函数抛出异常出栈以后,与return不同,代不同,代码并不是回到调用函数的地方,而是跳转到码并不是回到调用函数的地方,而是跳转到捕获该异常的代码处,如果该异常没有被捕捕获该异常的代码处,如果该异常没有被捕获,程序就会自动终止获,程序就会自动终止(异常终止异常终止)4.2 标准异常标准异常标准异常的基类是

22、标准异常的基类是exception。该类含有一个成员函数该类含有一个成员函数what()用于提供出错信息,函数原型:用于提供出错信息,函数原型:virtualconstchar*what();4.2 标准异常标准异常nexception的派生类分为的派生类分为3类:类:l语言核心的异常,直接派生自语言核心的异常,直接派生自exception。包括包括bad_alloc,bad_cast,bad_typeid,bad_exception。这些异常由运行时抛出,用户程序不应抛出这些异常。这些异常由运行时抛出,用户程序不应抛出这些异常。l逻辑异常,派生自逻辑异常,派生自logic_error。表示程

23、序运行中出现了逻辑错误表示程序运行中出现了逻辑错误(表示程序有表示程序有bug)。包括包括 length_error(长度过长长度过长),domain_error(专业领域范围内的专业领域范围内的错误错误),out_of_range(下标访问越界下标访问越界),invalid_argument(无效参无效参数数)。还有一个还有一个ios_base:failure(直接派生自直接派生自exception),表示,表示I/O过程过程中出现了错误。中出现了错误。l运行异常,派生自运行异常,派生自runtime_error。表示运行中遇到了不可预知的运行错误。表示运行中遇到了不可预知的运行错误。包括包

24、括range_error(内部运算超出数据类型范围内部运算超出数据类型范围),overflow_error(算术运算上溢算术运算上溢),underflow_error(算术运算下溢算术运算下溢)。运行异常也由运行时抛出,用户程序不抛出这些异常。运行异常也由运行时抛出,用户程序不抛出这些异常。4.3实现自己的异常实现自己的异常 异常类都是很简单的类,构造函数接收一个描述错误的字符串。异常类都是很简单的类,构造函数接收一个描述错误的字符串。为和标准异常类行为一致,提供一个为和标准异常类行为一致,提供一个what()成员函数返回错误成员函数返回错误描述字符串。描述字符串。classbaseExcep

25、tionpublic:baseException(conststring&str=):msgString(str)if(msgString=)msgString=Unspecifiedexception;stringwhat()constreturnmsgString;protected:stringmsgString;4.3实现自己的异常实现自己的异常classmemoryAllocationError:publicbaseExceptionpublic:memoryAllocationError(conststring&msg=):baseException(msg);classrange

26、Error:publicbaseExceptionpublic:rangeError(conststring&msg=):baseException(msg);然后再派生一些更特化的异常类。然后再派生一些更特化的异常类。这些派生类不增加任何成员,只用于标识不同的运行错误。这些派生类不增加任何成员,只用于标识不同的运行错误。4.4 捕获异常捕获异常函数抛出异常,函数抛出异常,调用函数通过调用函数通过try-catch块捕获异常块捕获异常。调用可能发生异常函数的代码应包围在中调用可能发生异常函数的代码应包围在中try-catch块块中。中。catch语句用于捕获异常,语法格式为:语句用于捕获异常,

27、语法格式为:try可能抛出异常的代码可能抛出异常的代码catch(异常类型异常类型变量名变量名)处理异常的代码处理异常的代码4.4 捕获异常捕获异常lcatch接收一个异常类型变量作为参数,可以接收一个异常类型变量作为参数,可以是普通类型,也可以是引用类型。为保证是普通类型,也可以是引用类型。为保证what()执行的多态效果,最好用引用类型。执行的多态效果,最好用引用类型。lcatch块的处理通常比较简单,打印异常变量块的处理通常比较简单,打印异常变量提供的信息,然后返回或退出程序。提供的信息,然后返回或退出程序。l一个一个try块可以后接多个块可以后接多个catch块块捕捉最特化的异常类放在

28、最前面捕捉最特化的异常类放在最前面越泛化的异常类放在后面越泛化的异常类放在后面最后一个最后一个catch块用块用号表示捕捉所有未指定的号表示捕捉所有未指定的异常。异常。4.4 捕获异常捕获异常try.catch(constindexRangeError&err)cerrerr.what()endl;return-1;catch(constmemoryAllocationError&err)cerrerr.what()endl;return-1;catch(constbaseException&err)cerrerr.what()endl;return-1;catch(.)cerrOops!Un

29、knownexception.endl;return-1;4.4 捕获异常捕获异常5测试和调试测试和调试n5.1 测试测试l测试的概念测试的概念测试简单的说就是通过一组选择的输入检查程序测试简单的说就是通过一组选择的输入检查程序的输出是否是期望的结果的输出是否是期望的结果l要点:要点:如何选择输入数据如何选择输入数据白盒测试白盒测试黑盒测试黑盒测试掌握程序正确的输出结果掌握程序正确的输出结果335.1 测试测试n测试的组织测试的组织l单元测试就是测试每个单个的函数单元测试就是测试每个单个的函数单元测试可以采用黑盒和白盒测试单元测试可以采用黑盒和白盒测试l系统测试是将所有经过测试的函数组装在一系

30、统测试是将所有经过测试的函数组装在一起进行测试起进行测试系统测试采用黑盒测试系统测试采用黑盒测试系统测试除了测试程序的逻辑错误外,也可以有系统测试除了测试程序的逻辑错误外,也可以有意的测试系统对运行时错误的反应,比如拔掉网意的测试系统对运行时错误的反应,比如拔掉网线,机器掉电,制造硬盘满现象,制造大量的并线,机器掉电,制造硬盘满现象,制造大量的并发访问流量等发访问流量等345.1 测试测试n以阶梯型电阻电路为例:以阶梯型电阻电路为例:l目标:目标:编写编写3个函数,输入阶梯型电阻电路的参数,输出电路的参数,计个函数,输入阶梯型电阻电路的参数,输出电路的参数,计算电路的等值电阻。算电路的等值电阻

31、。3个函数逐个实现和测试,都完成以后再组装进行系统测试。个函数逐个实现和测试,都完成以后再组装进行系统测试。l过程:过程:首先实现和测试输出电路参数的函数首先实现和测试输出电路参数的函数(因为输出功能正确实现后,因为输出功能正确实现后,才能知道输入的值是否正确才能知道输入的值是否正确)先写一个假的输入函数,称为先写一个假的输入函数,称为stub(占位函数占位函数)。这个函数可以。这个函数可以简单的用一个循环给存放电阻值的向量中任意存入一些数字简单的用一个循环给存放电阻值的向量中任意存入一些数字然后编写然后编写main函数调用这函数调用这2个函数个函数(此时此时main函数是一个测试驱函数是一个

32、测试驱动动Driver)。测试用例可以选择向量中有测试用例可以选择向量中有0个数据,有少量数据,有很多数个数据,有少量数据,有很多数据据3种情况进行测试。种情况进行测试。Page 355.1 测试测试n以阶梯型电阻电路为例:以阶梯型电阻电路为例:l过程:过程:再实现和测试输入参数的函数。再实现和测试输入参数的函数。测试时可以故意输入阻值测试时可以故意输入阻值0,一个电阻值也不输入,一个电阻值也不输入,输入奇数个电阻值,输入负数和输入正常的偶数个输入奇数个电阻值,输入负数和输入正常的偶数个正数几种情况进行测试。正数几种情况进行测试。最后实现和测试计算等值电阻的函数。最后实现和测试计算等值电阻的函

33、数。输入一些特别设计的电阻值,这些电阻值使得等值输入一些特别设计的电阻值,这些电阻值使得等值电阻和端口电流很容易计算电阻和端口电流很容易计算比对程序计算结果和应得结果。比对程序计算结果和应得结果。3个函数都完成以后,修改个函数都完成以后,修改main函数为最终的函数为最终的实现。然后任意输入数据检查运行结果是否正实现。然后任意输入数据检查运行结果是否正确。确。365.2 调试调试n如果测试发现函数或程序没有按照得出预如果测试发现函数或程序没有按照得出预计的正确结果表明程序有逻辑错误,此时计的正确结果表明程序有逻辑错误,此时应通过调试手段找出并消除错误应通过调试手段找出并消除错误375.2 调试

34、调试n编写质量良好的代码编写质量良好的代码l良好的注释。函数的参数含义,返回值,前置条件,后置条良好的注释。函数的参数含义,返回值,前置条件,后置条件件l变量和函数采用有意义的名字。循环变量尽量不采用简单的变量和函数采用有意义的名字。循环变量尽量不采用简单的i和和j。l使用一致的缩进风格。使用一致的缩进风格。l充分利用函数分解任务和实现封装。充分利用函数分解任务和实现封装。l尽量用简单清晰的代码,避免复杂的循环嵌套,条件语句嵌尽量用简单清晰的代码,避免复杂的循环嵌套,条件语句嵌套,复杂的逻辑和关系表达式。套,复杂的逻辑和关系表达式。l尽量使用标准库的功能尽量使用标准库的功能l函数中使用函数中使

35、用assert宏和异常报告错误,主函数捕获异常。宏和异常报告错误,主函数捕获异常。385.2 调试调试n调试的手段调试的手段l认真读代码认真读代码成本最小的调试技术成本最小的调试技术常见的错误类型有:变量未初始化,指针未初始化,指针未指向有效内存空常见的错误类型有:变量未初始化,指针未初始化,指针未指向有效内存空间,差间,差1错误,数组越界访问,不正确的数据类型转换,误用错误,数组越界访问,不正确的数据类型转换,误用=和和=,野指针,野指针,多次释放同一指针。多次释放同一指针。l打印运行信息打印运行信息通过通过cout或或printf打印运行信息,定位程序出错的位置打印运行信息,定位程序出错的

36、位置assert宏和打印的异常信息都有助于定位程序出错的位置宏和打印的异常信息都有助于定位程序出错的位置定位程序出错位置后,仔细检查附近的代码,看是否有上述常见问题。如果定位程序出错位置后,仔细检查附近的代码,看是否有上述常见问题。如果附近代码看起来很正常,或者程序出错的位置没有什么规律,甚至很难复现,附近代码看起来很正常,或者程序出错的位置没有什么规律,甚至很难复现,通常是由于指针的问题通常是由于指针的问题(野指针或者越界访问野指针或者越界访问)或并发产生的问题。避免指针问或并发产生的问题。避免指针问题的最好方法是不使用指针,而使用题的最好方法是不使用指针,而使用C+标准库提供的各种标准数据结构标准库提供的各种标准数据结构l用调试器调试用调试器调试通过调试器进行调试是成本最高,最耗费时间的调试方法,所以应优先采用通过调试器进行调试是成本最高,最耗费时间的调试方法,所以应优先采用前前2种方法,在故障位置能基本确定后再用调试器。种方法,在故障位置能基本确定后再用调试器。39The End40此此课件下件下载可自行可自行编辑修改,修改,仅供参考!供参考!感感谢您的支持,我您的支持,我们努力做得更好!努力做得更好!谢谢!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 考试试题 > 语文专题

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁