管理系统遇到的BUG+结束总结"/>
银行管理系统遇到的BUG+结束总结
2017年7月12日 10:10:56周一的时候写开户操作,当天下午发现一个段错误,然后调试了一天,发现自己代码逻辑没有错误,该分配的内存也都分配了,仍然出现“stack smashint dected”的错误。 下面先贴出代码: int Open::DataBase() { int result = 0; char buf[100];
int flag = 0; //在数据库中存在的标志位 My_Sql sql("Blank"); vector<string> temp;
//×××××××××××××××××××××××× //这里要换成ID以后 sprintf(buf,"select name = \"%s\" from user;",_name); //××××××××××××××××××××××××××××××
sql.MySql_exec(buf); temp = sql.GetRowInformation(); MyTools tool; flag = tool.DataHandle(temp);
if(flag == 0) //该处,判断内容有无,有待优化! { //可以注册 sprintf(buf,"insert into user(id,name,passwd,action,money) values( \"%s\",\"%s\",\"%s\",\"%s\",\"%s\");",_id,_name,_passwd,OPEN,_money); sql.MySql_exec(buf); //该处没判断
sprintf(buf,"select idd from user where name = \"%s\";",_name); //注册成功后获取自动生成的ID sql.MySql_exec(buf); temp = sql.GetRowInformation(); strcpy(_idd,temp[0].c_str()); printf("idd:%s\n",_idd);
result = REGIST_SUCCESS; } else { result = HAS_ACCOUNT; }
return result; }
这段操作的功能是:开户操作的数据库处理,首先根据用户名,查找数据库中有无重复的姓名,没有则进行注册操作,后期会把用户名改为身份证号,避免重复。 开户成功后,会从数据库中获取自动生成的ID号码,返回给客户端,让客户端显示ID。 有关数据库的操作都已经封装在类中,没有错误。 用printf大法发现,程序执行到 return 前都正确,返回时候出错。 我真是惊呆了。。。。返回个int也有错。。。
最后我实在找不出错误,还是去百度了一下。。。
后来发现是 mysql语句过长,没有检查 buf[100]是否够用,在我修改成buf[1024]之后就OK了。。。
以下是百度出来的重要信息:
Stack Smashing is actually a protection mechanism user by gcc to detect buffer overflow attacks.
stack smashing是GCC的一种检测“缓存溢出”的保护机制,不一定会立马显示出段错误,当分配的内存不足时,会继续执行,但是在程序结束返回时才出现错误提示。
2017年7月12日 21:58:32
关于vector的操作
vector<string> t; t.clear();
sting a = t[0]; //该步骤会出现内存溢出,不是空
2017年7月13日 20:14:51
C++项目写完,以下做一个总结。
1. 时间 7月5号,也就是上周三,开始写这个项目。 周三:复习QT,MySql,json的基本操作,对项目进行整体,构思 周四:正式开始写项目,当天的完成情况已经git 周五:同上 周六、周日上课 周一:同周四 周二:休息,算是睡了一天 周三:下午完成项目
总的来说这个项目从无到有,花了5天的时间,项目基本上按照计划上的要求来完成的。 这5天时间,基本上从早上来教室,就开始写,一直到晚上回去,有点想以前写聊天室的时候。
2. 总结 累了那么多天写完项目,首先要夸自己一下。我感觉到自己明显的进步。 寒假写聊天室,可以说前几天都在做无用功。自己写的框架,写着写着就被自己推翻了, 功能一个一个之间联系的比较紧密,当多线程的时候互相影响非常严重,感觉自己写出来的 东西,像是在夹缝中求生存,能活下来真的是万幸。
这次的C++银行管理系统,首先从难度上来说,并没有聊天室大,或许是我变厉害了。 其次,在做这个项目之前,我用C++把聊天室改好了,而且改了相当长的时间,每天 的修改都做了git。C++的聊天室,代码写的很冗余,好多重复的部分,也有好多没必要的部分, 其实我就像拿C++聊天室,练练手,对C++和设计模式多多了解,反正单例模式,我是很熟悉了。 而且我注意到单利模式居然可以实现信息的共享,static关键字会对多线程造成非常致命的影响。 或许这些只有自己花了N多小时之后才有感悟的东西,老师以前讲过,但自己写完项目之后,感触非常深。 至少我以后写单利模式都会带把锁了。 C++聊天室写好之后,非常能感觉到面向对象的好处。在写完之后,虽然写的很多,但自己回想,整个代码 结构非常清晰,这一特点也延续到了现在的项目。 这次的银行管理系统,难就难在对数据包的处理。通过对json的学习,我发现,没必要像以前一样传输结构体。 因为这种写法的缺陷太明显了: 1.浪费空间 2.把所有的信息放在一个结构体里,不安全 3.只能处理定常数据
现在我是这么处理传输信息: 4字节操作信息+下一个信息长度(4字节)+不定常信息+..... 在服务器接收之后,对4字节进行处理,执行对应操作,再读取剩下的内容,每次读取到长度,就申请一段 对应长度空间,然后再读取,以此往复
这样做也有缺陷,就是字符串太长,造成缓冲区不够。
服务器也可以以同样的方式发送信息给客户端,但是我懒了,没高兴继续写。。。。
最后说说自己的不足: 1. 对设计模式研究的不够,银行的项目我用了单例模式,抽象工厂+反射机制,但这远远不够 2. 对面向对象的理解不够。在写项目时候,我发现自己的思维还是很像面向过程。 往往在自己需要什么,然后再写什么,解决对应的问题。 3. 对C++的理解不够。很多时候不知道变量该用private放在class中,还是就定义局部变量,有时候很难抉择。 4. 项目并没有写的非常完美,如果这个是工作,客户要求肯定没有完美达成
更多推荐
银行管理系统遇到的BUG+结束总结
发布评论