银行管理系统遇到的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. 项目并没有写的非常完美,如果这个是工作,客户要求肯定没有完美达成
































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值