代码bug修正
优秀的邓宗磊
这是一个优秀的人呢
展开
-
代码bug修正,char转换为int高位符号扩展,导致正负性和数值发生改变,int num = (int)(unsigned int)a,老一点的编译器会出现的问题
代码bug修正,char转换为int高位符号扩展,导致正负性和数值发生改变,int num = (int)(unsigned int)a,老一点的编译器会出现的问题场景:char数据类型转换为int时,如果使用char a = 0x9A;int num = (int)a;通过计算可以得出a的int值应该是154,但实际上的代码得出的却是-102,发生了逻辑错误。原因:详细解释起来需要讲到计算机中负数的表现方法,需要将补码啥的,这方面暂时不太行。解决方法:char a = 0x9A;int原创 2022-02-05 12:03:18 · 514 阅读 · 0 评论 -
代码bug修正,int承载数字太大导致变为负数
代码bug修正场景:在if(inum > ilevel)判断语句中,因为要判断num值大于level的80%是进行一些操作,使用的方法是将语句改为if(num > level * 80 / 100)。问题:将ilevel设置的很大,但不管inum值有多小,if的判断都会为真,但实际inum数值上不应该大于ilevel的80%,导致了意料之外的逻辑错误。原因:当ilevel的值设定较大,比如为100000000时,其乘以80导致其值8000000000超出了int的范围,int容纳数值原创 2022-01-29 13:42:19 · 1664 阅读 · 0 评论 -
函数传参时,数值发生改变的bug
函数传参时,数值发生改变的bug已修复,无截图现象:在调用函数时,传入的数值,和实际上用来计算的数值不一样,以int为例,体现在:0、调试情况下,1、传入时,也就是函数调用时的参数数值为a,2、跳转到函数实现时,对应位置的参数值不为a了,然后导致了函数运行与期待不符。原因之一:两个cpp分别作为独立的编译单元,没有在完全相同的环境下编译成动态库:1、相同源代码,编译工具不同,比如一个用vs,一个用gcc2、相同源代码,编译版本不同,比如一个用vs2008,一个用vs20193、相同源代原创 2022-01-25 19:40:21 · 2264 阅读 · 1 评论 -
指针作为返回值时的陷阱:栈区指针被当做返回值,返回时连带返回了栈区变量
指针作为返回值时的陷阱:栈区指针被当做返回值,返回时连带返回了栈区变量使用返回值时的经典失误:返回了栈区数据,函数内声明的指针或变量被返回到了外面class ATest{public: int* mivalue;};ATest* GetString(void){ ATest* a = new ATest(); int tmpi = 10; a->mivalue = &tmpi; //这个a被返回是不安全的,因为其本身是个临时指针, //附带有临时变量,它可以把自己指原创 2021-11-07 18:31:38 · 196 阅读 · 0 评论 -
指针作为参数传递时的陷阱,内部操作指针指向的地址(指针的栈内容),而不是操作指针指向的内存(指针的堆内容),函数内申请指针内存
指针作为参数传递时的陷阱:内部操作了指针指向的地址(指针的栈内容),而没有操作指针指向的内存(指针的堆内容),从而导致程序运行不如意。此处以:传入指针在函数内申请空间的经典错误为例指针经典错误操作:在传入函数中申请内存void GetMemory(char *p, int num){p = (cahr *)malloc(sizeof(char) * num);}void Test(void){char *str = NULL;GetMemory(str, 100);//str在这里仍然为原创 2021-11-07 17:51:16 · 673 阅读 · 0 评论 -
VS报错LNK1104原因之:引入外部库文件却没有将其路径添加至main所在项目的链接器的附加库目录
VS报错LNK1104原因之一:隐式引用外部库文件(无论静态库还是动态库),却没有将其路径添加至main所在项目的链接器。场景:需要用到外部提供的API,此处用静态库示范,调用方法为隐式调用,即使用#pragma comment(lib,“test.lib”)语法导入静态库,文件结构包括头文件和打包成lib的源文件,这里的API接口函数只有一个test()函数。代码:#include <iostream>#include "../test/include/test.h"#pragma原创 2021-10-03 23:11:55 · 3519 阅读 · 0 评论 -
c++,stl中map容器插入元素报异常的场景之一
c++,stl中map容器插入元素报异常的场景之一代码bug解决:遇到一个往map中插入元素报异常的问题,问题已解决故无截图。场景:map容器的insert函数在使用时抛出异常,不是插入失败而是插入报异常。原因:插入到map中的数据的数据结构被改变了,导致map中容纳的数据结构和实际上插入的数据结构不相同,虽然数据类型的标识符相同,但实际可容纳的数据和插入的不同,导致了插入报出异常。分析:1、出现“插入的数据和map中容纳的数据的数据结构不相同”这种情况的原因是,数据定义的动态库,和map容原创 2022-01-01 12:48:36 · 2910 阅读 · 1 评论 -
error C2039,不是类成员 问题出现的原因之一与解决方法
error C2039,不是类成员 问题出现的原因之一与解决方法在visual stdio中编代码时,编译器有时会给代码报出 不是类成员 的错误,错误为error C2039。场景:例如观察者模式中,两个类相互需要以对方做为自己函数的参数或本身包含对方类的指针,也需要在自己类的方法定义中调用另一个类的函数报错原因:使用了未被声明 的类或函数,即类和函数被调用前必须声明。不然报错error C2039,不是类成员正确步骤:1.写出两个类的声明2.写出两个类中成员与函数的声明原创 2021-08-22 15:19:08 · 34097 阅读 · 0 评论 -
报错error2280调用已被删除的函数,原理,分析,应用,实现noncopyable父类的方法。
报错error2280调用已被删除的函数,原理,分析,应用,实现noncopyable父类的方法。原因之一:子类调用父类中访问权限为private的函数或数据。private来源:可能是父类中设置为private,或者继承时用了private继承。分析:父类中的函数访问权限为private,子类继承后,父类中的private函数或数据成员被编译器隐式删除(不经程序员同意偷偷删了),程序员通过子类调用了父类函数或数据成员,但访问权限为private,编译器编译时就会报错,error2280调用已被删除原创 2021-08-28 16:29:24 · 745 阅读 · 0 评论 -
c++,报错E0137,表达式必须是可修改的左值,报错原因之一
c++,报错E0137,表达式必须是可修改的左值,报错原因之一在vs中编程时偶然遇到的问题,如图:在本例中,出现这个问题的条件:1、类成员函数被使用const修饰,导致该函数不能对类成员数据进行修改。2、程序员在被const关键字修饰的函数中无意中修改了类成员数据。解决方法:1、双击错误跳转到出现错误的地方,会跳到被修改的类成员数据的行处。2、鼠标滚轮上转,直到到达修改数据语句所在的函数的声明处,这里找到了对应的函数func_const,发现他是被const修饰了3、去掉const,错原创 2021-12-12 21:22:09 · 98132 阅读 · 1 评论 -
“读取字符串的字符时出错”“内存访问失败”,程序员未显式使用new导致对象调用malloc,分配内存后未调用构造函数初始化。
调试bug解决篇:“读取字符串的字符时出错”,“内存访问失败”,程序员未显式使用new导致对象调用malloc,分配内存后未调用构造函数初始化。现象:在函数里定义了一个对象,但调试时发现里面的string数据中的字符报“读取字符串的字符时出错”,里面的每一个字符的位置上都报“内存访问失败”的字样。(代码bug已修复,故无截图)原因:使用结构体变量类型定义一个结构体时,因为工程环境或者其他原因导致编译器对该变量只使用malloc分配内存,没有调用相应的构造函数对内部的数据初始化,比如重要的指针数据,和原创 2021-11-29 21:09:03 · 10108 阅读 · 3 评论