qt计算器按等号闪退

问题遇到的现象和发生背景

在linux下的qt里面编写一般计算器的程序,运行之后按等号会闪退。

问题相关代码,请勿粘贴截图

以下是在qt中写的计算器程序代码

 QStack<int> s_num,s_opt;
    char opt[128]={0};
    int i = 0, tmp = 0, num1, num2;
    //how change Qstring into char *
    QByteArray ba;
    ba.append(expression);//change QString into QByteArray
    strcpy(opt,ba.data());//change QBbyteArray into const

    while (opt[i] !='\0' || s_opt.empty() != true)
    {
        if (opt[i] >= '0' && opt[i] <= '9')
        {
            tmp = tmp * 10 + opt[i] - '0';
            i++;
            if(opt[i] < '0' || opt[i] > '9')
            {
                s_num.push(tmp);
                tmp = 0;
            }
        }
        else
        {
            if(s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||
                    (s_opt.top() == '('&& opt[i] != ')'))
            {
                s_opt.push(opt[i]);
                i++;
                continue;
            }

            if(s_opt.top() == '(' && opt[i] == ')')
            {
                s_opt.pop();
                i++;
                continue;
            }

            if(Priority(opt[i]) <= Priority(s_opt.pop()) || (opt[i] == ')'&& s_opt.top()!= '(') ||
                (opt[i] == '\0' && s_opt.empty() != true ))
            {
                char ch = s_opt.top();
                s_opt.pop();
                switch(ch)
                {
                case '+':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num1 + num2);
                    break;
                case '-':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num1 - num2);
                    break;
                case '*':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num1 * num2);
                    break;
                case '/':
                    num1 = s_num.top();
                    s_num.pop();
                    num2 = s_num.top();
                    s_num.pop();
                    s_num.push(num1 / num2);
                    break;
                }
            }
        }
    }
ui->mainlineEdit->setText(QString::number(s_num.top()));
}



int MainWindow::Priority(char ch)
{
        switch(ch)
        {
        case '(':
                return 3;
        case '*':
        case '/':
                return 2;
        case '+':
        case '-':
                return 1;
        default:
                return 0;
        }
}

运行结果及报错内容
*** glibc detected *** /home/chen/qt/caculator-build-desktop/caculator: free(): invalid next size (fast): 0x0825fff8 ***
======= Backtrace: =========
/lib/libc.so.6[0x985ee4]
/lib/libc.so.6(realloc+0x1ba)[0x98a02a]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_Z8qReallocPvj+0x24)[0x17bf54]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN11QVectorData10reallocateEPS_iii+0x4c)[0x1e76cc]
/home/chen/qt/caculator-build-desktop/caculator[0x804ec5e]
/home/chen/qt/caculator-build-desktop/caculator[0x804ed20]
/home/chen/qt/caculator-build-desktop/caculator[0x804c30c]
/home/chen/qt/caculator-build-desktop/caculator[0x804ee4b]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN11QMetaObject8metacallEP7QObjectNS_4CallEiPPv+0x53)[0x2a2143]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN11QMetaObject8activateEP7QObjectPKS_iPPv+0x274)[0x2b25a4]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN15QAbstractButton7clickedEb+0x49)[0x17be959]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(+0x5bf679)[0x1485679]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(+0x5c0e80)[0x1486e80]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN15QAbstractButton17mouseReleaseEventEP11QMouseEvent+0x7c)[0x14870fc]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN7QWidget5eventEP6QEvent+0x5d9)[0x108d8b9]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN15QAbstractButton5eventEP6QEvent+0x3f)[0x1485fdf]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN11QPushButton5eventEP6QEvent+0x48)[0x1534d08]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0xbc)[0x1027ffc]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN12QApplication6notifyEP7QObjectP6QEvent+0x18f4)[0x1030464]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent+0x7b)[0x29b68b]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb+0xf2)[0x102af12]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(+0x1f51d5)[0x10bb1d5]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN12QApplication15x11ProcessEventEP7_XEvent+0x1a6e)[0x10ba8fe]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(+0x221424)[0x10e7424]
/lib/libglib-2.0.so.0(g_main_context_dispatch+0x1d2)[0xb7e192]
/lib/libglib-2.0.so.0[0xb7e978]
/lib/libglib-2.0.so.0(g_main_context_iteration+0x65)[0xb7ec35]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE+0x61)[0x2cbbb1]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(+0x220f75)[0x10e6f75]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0x4d)[0x29a82d]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0xaa)[0x29aaba]
/opt/qtsdk-2010.05/qt/lib/libQtCore.so.4(_ZN16QCoreApplication4execEv+0xb1)[0x29cc11]
/opt/qtsdk-2010.05/qt/lib/libQtGui.so.4(_ZN12QApplication4execEv+0x27)[0x1027757]
/home/chen/qt/caculator-build-desktop/caculator[0x804abb2]
/lib/libc.so.6(__libc_start_main+0xe6)[0x92ae16]
/home/chen/qt/caculator-build-desktop/caculator[0x804aab1]
======= Memory map: ========
00110000-003e5000 r-xp 00000000 08:03 2229603    /opt/qtsdk-2010.05/qt/lib/libQtCore.so.4.7.0
003e5000-003ee000 rw-p 002d5000 08:03 2229603    /opt/qtsdk-2010.05/qt/lib/libQtCore.so.4.7.0
003ee000-0047c000 r-xp 00000000 08:03 3556041    /usr/lib/libfreetype.so.6.6.0
0047c000-00480000 rw-p 0008d000 08:03 3556041    /usr/lib/libfreetype.so.6.6.0
00480000-00482000 r-xp 00000000 08:03 3543506    /usr/lib/gconv/UTF-16.so
00482000-00483000 r--p 00001000 08:03 3543506    /usr/lib/gconv/UTF-16.so
00483000-00484000 rw-p 00002000 08:03 3543506    /usr/lib/gconv/UTF-16.so
00484000-0048b000 r-xp 00000000 08:03 3556055    /usr/lib/libXrandr.so.2.2.0
0048b000-0048c000 rw-p 00006000 08:03 3556055    /usr/lib/libXrandr.so.2.2.0
0048c000-00495000 r-xp 00000000 08:03 3556057    /usr/lib/libXcursor.so.1.0.2
00495000-00496000 rw-p 00008000 08:03 3556057    /usr/lib/libXcursor.so.1.0.2
00538000-0056b000 r-xp 00000000 08:03 3556042    /usr/lib/libfontconfig.so.1.4.4
0056b000-0056d000 rw-p 00032000 08:03 3556042    /usr/lib/libfontconfig.so.1.4.4
0056d000-006a0000 r-xp 00000000 08:03 3556046    /usr/lib/libX11.so.6.3.0
006a0000-006a4000 rw-p 00132000 08:03 3556046    /usr/lib/libX11.so.6.3.0
006ef000-006f1000 r-xp 00000000 08:03 3556053    /usr/lib/libXinerama.so.1.0.0
006f1000-006f2000 rw-p 00001000 08:03 3556053    /usr/lib/libXinerama.so.1.0.0
008e4000-008e8000 r-xp 00000000 08:03 4724951    /lib/libuuid.so.1.3.0
008e8000-008e9000 rw-p 00003000 08:03 4724951    /lib/libuuid.so.1.3.0
008f0000-00910000 r-xp 00000000 08:03 4724917    /lib/ld-2.12.90.so
00910000-00911000 r--p 0001f000 08:03 4724917    /lib/ld-2.12.90.so
00911000-00912000 rw-p 00020000 08:03 4724917    /lib/ld-2.12.90.so
00914000-00aa1000 r-xp 00000000 08:03 4724918    /lib/libc-2.12.90.so
00aa1000-00aa3000 r--p 0018c000 08:03 4724918    /lib/libc-2.12.90.so
00aa3000-00aa4000 rw-p 0018e000 08:03 4724918    /lib/libc-2.12.90.so
00aa4000-00aa7000 rw-p 00000000 00:00 0 
00aa9000-00ac1000 r-xp 00000000 08:03 4724919    /lib/libpthread-2.12.90.so
00ac1000-00ac2000 r--p 00017000 08:03 4724919    /lib/libpthread-2.12.90.so
00ac2000-00ac3000 rw-p 00018000 08:03 4724919    /lib/libpthread-2.12.90.so
00ac3000-00ac5000 rw-p 00000000 00:00 0 
00ac7000-00aca000 r-xp 00000000 08:03 4724926    /lib/libdl-2.12.90.so
00aca000-00acb000 r--p 00002000 08:03 4724926    /lib/libdl-2.12.90.so
00acb000-00acc000 rw-p 00003000 08:03 4724926    /lib/libdl-2.12.90.so
00ace000-00ad6000 r-xp 00000000 08:03 4724920    /lib/librt-2.12.90.so
00ad6000-00ad7000 r--p 00007000 08:03 4724920    /lib/librt-2.12.90.so
00ad7000-00ad8000 rw-p 00008000 08:03 4724920    /lib/librt-2.12.90.so
00ada000-00aee000 r-xp 00000000 08:03 4724932    /lib/libz.so.1.2.5
00aee000-00aef000 rw-p 00013000 08:03 4724932    /lib/libz.so.1.2.5
00af1000-00b19000 r-xp 00000000 08:03 4724930    /lib/libm-2.12.90.so
00b19000-00b1a000 r--p 00027000 08:03 4724930    /lib/libm-2.12.90.so
00b1a000-00b1b000 rw-p 00028000 08:03 4724930    /lib/libm-2.12.90.so
00b3e000-00c4b000 r-xp 00000000 08:03 4724922    /lib/libglib-2.0.so.0.2600.0
00c4b000-00c4c000 rw-p 0010d000 08:03 4724922    /lib/libglib-2.0.so.0.2600.0
00c4e000-00c6a000 r-xp 00000000 08:03 4724928    /lib/libgcc_s-4.5.1-20100924.so.1
00c6a000-00c6b000 rw-p 0001b000 08:03 4724928    /lib/libgcc_s-4.5.1-20100924.so.1
00c89000-00cd7000 r-xp 00000000 08:03 4724924    /lib/libgobject-2.0.so.0.2600.0
00cd7000-00cd8000 rw-p 0004d000 08:03 4724924    /lib/libgobject-2.0.so.0.2600.0
00cd8000-00cd9000 rw-p 00000000 00:00 0 
00cdb000-00cdf000 r-xp 00000000 08:03 4724923    /lib/libgthread-2.0.so.0.2600.0
00cdf000-00ce0000 rw-p 00003000 08:03 4724923    /lib/libgthread-2.0.so.0.2600.0
00d35000-00d52000 r-xp 00000000 08:03 3556045    /usr/lib/libxcb.so.1.1.0
00d52000-00d53000 rw-p 0001c000 08:03 3556045    /usr/lib/libxcb.so.1.1.0
00d55000-00d57000 r-xp 00000000 08:03 3556044    /usr/lib/libXau.so.6.0.0
00d57000-00d58000 rw-p 00001000 08:03 3556044    /usr/lib/libXau.so.6.0.0
00d5a000-00d80000 r-xp 00000000 08:03 4724931    /lib/libexpat.so.1.5.2
00d80000-00d82000 rw-p 00025000 08:03 4724931    /lib/libexpat.so.1.5.2
00d84000-00d94000 r-xp 00000000 08:03 3556052    /usr/lib/libXext.so.6.4.0
00d94000-00d95000 rw-p 00010000 08:03 3556052    /usr/lib/libXext.so.6.4.0
00dba000-00dc8000 r-xp 00000000 08:03 3556054    /usr/lib/libXi.so.6.1.0
00dc8000-00dc9000 rw-p 0000d000 08:03 3556054    /usr/lib/libXi.so.6.1.0
00dee000-00df6000 r-xp 00000000 08:03 3556047    /usr/lib/libXrender.so.1.3.0
00df6000-00df7000 rw-p 00008000 08:03 3556047    /usr/lib/libXrender.so.1.3.0
00df9000-00dfd000 r-xp 00000000 08:03 3556056    /usr/lib/libXfixes.so.3.1.0
00dfd000-00dfe000 rw-p 00003000 08:03 3556056    /usr/lib/libXfixes.so.3.1.0
00ec5000-00ec6000 r-xp 00000000 00:00 0          [vdso]
00ec6000-01a09000 r-xp 00000000 08:03 2229605    /opt/qtsdk-2010.05/qt/lib/libQtGui.so.4.7.0
01a09000-01a33000 rw-p 00b43000 08:03 2229605    /opt/qtsdk-2010.05/qt/lib/libQtGui.so.4.7.0
01a33000-01a35000 rw-p 00000000 00:00 0 
03571000-03654000 r-xp 00000000 08:03 3552224    /usr/lib/libstdc++.so.6.0.14
03654000-03658000 r--p 000e2000 08:03 3552224    /usr/lib/libstdc++.so.6.0.14
03658000-0365a000 rw-p 000e6000 08:03 3552224    /usr/lib/libstdc++.so.6.0.14
0365a000-03660000 rw-p 00000000 00:00 0 
0396f000-03976000 r-xp 00000000 08:03 3556124    /usr/lib/libSM.so.6.0.0
03976000-03977000 rw-p 00006000 08:03 3556124    /usr/lib/libSM.so.6.0.0
03979000-03990000 r-xp 00000000 08:03 3545435    /usr/lib/libICE.so.6.3.0
03990000-03992000 rw-p 00016000 08:03 3545435    /usr/lib/libICE.so.6.3.0
03992000-03993000 rw-p 00000000 00:00 0 
08048000-08051000 r-xp 00000000 08:03 1993397    /home/chen/qt/caculator-build-desktop/caculator
08051000-08052000 rw-p 00008000 08:03 1993397    /home/chen/qt/caculator-build-desktop/caculator
081b7000-08376000 rw-p 00000000 00:00 0          [heap]
b747b000-b7522000 r--p 00000000 08:03 3932318    /usr/share/fonts/dejavu/DejaVuSans.ttf
b7522000-b7523000 r--s 00000000 08:03 4457611    /var/cache/fontconfig/5ca013d2b71e1f466e8b3a3705f99d44-le32d4.cache-3
b7523000-b7526000 r--s 00000000 08:03 4457675    /var/cache/fontconfig/87f5e051180a7a75f16eb6fe7dbd3749-le32d4.cache-3
b7526000-b752c000 r--s 00000000 08:03 4457677    /var/cache/fontconfig/b79f3aaa7d385a141ab53ec885cc22a8-le32d4.cache-3
b752c000-b752e000 r--s 00000000 08:03 4457616    /var/cache/fontconfig/0b1bcc92b4d25cc154d77dafe3bceaa0-le32d4.cache-3
b752e000-b7530000 r--s 00000000 08:03 4457615    /var/cache/fontconfig/2e1514a9fdd499050989183bb65136db-le32d4.cache-3
b7530000-b7532000 r--s 00000000 08:03 4457614    /var/cache/fontconfig/5c755b2f27115486aa6359c84dd3cbda-le32d4.cache-3
b7532000-b7533000 r--s 00000000 08:03 4457613    /var/cache/fontconfig/3f821257dd33660ba7bbb45c32deb84c-le32d4.cache-3
b7533000-b7535000 r--s 00000000 08:03 4457612    /var/cache/fontconfig/830f035fa84a65ce80e050178dbb630d-le32d4.cache-3
b7535000-b7536000 r--s 00000000 08:03 4457609    /var/cache/fontconfig/ac68f755438cc3dc5a526084839fc7ca-le32d4.cache-3
b7536000-b7537000 r--s 00000000 08:03 4457608    /var/cache/fontconfig/12513961c6e7090f8648812f9eaf65d6-le32d4.cache-3
b7537000-b7539000 r--s 00000000 08:03 4457607    /var/cache/fontconfig/e26bf336397aae6fcef4d3803472adec-le32d4.cache-3
b7539000-b753a000 r--s 00000000 08:03 4457606    /var/cache/fontconfig/a5c2dc934fad9bbf30c854216245519d-le32d4.cache-3
b753a000-b753b000 r--s 00000000 08:03 4457605    /var/cache/fontconfig/17e60ccdf2eb53b214a9a5d6663eb217-le32d4.cache-3
b753b000-b753c000 r--s 00000000 08:03 4457604    /var/cache/fontconfig/b887eea8f1b96e1d899b44ed6681fc27-le32d4.cache-3
b753c000-b753d000 r--s 00000000 08:03 4457603    /var/cache/fontconfig/860639f272b8b4b3094f9e399e41bccd-le32d4.cache-3
b753d000-b753e000 r--s 00000000 08:03 4457602    /var/cache/fontconfig/211368abcb0ff835c229ff05c9ec01dc-le32d4.cache-3
b753e000-b753f000 r--s 00000000 08:03 4457601    /var/cache/fontconfig/c46020d7221988a13df853d2b46304fc-le32d4.cache-3
b753f000-b7540000 r--s 00000000 08:03 4457600    /var/cache/fontconfig/df893b4576ad6107f9397134092c4059-le32d4.cache-3
b7540000-b7541000 r--s 00000000 08:03 4457599    /var/cache/fontconfig/900402270e15d763a6e008bb2d4c7686-le32d4.cache-3
b7541000-b7542000 r--s 00000000 08:03 4457598    /var/cache/fontconfig/47f48679023f44a4d1e44699a69464f6-le32d4.cache-3
b7542000-b7543000 r--s 00000000 08:03 4457597    /var/cache/fontconfig/2881ed3fd21ca306ddad6f9b0dd3189f-le32d4.cache-3
b7543000-b7544000 r--s 00000000 08:03 4457596    /var/cache/fontconfig/3c3fb04d32a5211b073874b125d29701-le32d4.cache-3
b7544000-b7545000 r--s 00000000 08:03 4457595    /var/cache/fontconfig/e61abf8156cc476151baa07d67337cae-le32d4.cache-3
b7545000-b7548000 r--s 00000000 08:03 4457594    /var/cache/fontconfig/b67b32625a2bb51b023d3814a918f351-le32d4.cache-3
b7548000-b7549000 r--s 00000000 08:03 4457593    /var/cache/fontconfig/d3379abda271c4acd2ad0c01f565d0b0-le32d4.cache-3
b7549000-b7749000 r--p 00000000 08:03 3543266    /usr/lib/locale/locale-archive
b7749000-b7751000 rw-p 00000000 00:00 0 
b7751000-b7752000 r--s 00000000 08:03 4457592    /var/cache/fontconfig/b4d0b56f766d89640448751fcd18ec1e-le32d4.cache-3
b7752000-b7759000 r--s 00000000 08:03 4457591    /var/cache/fontconfig/12b26b760a24f8b4feb03ad48a333a72-le32d4.cache-3
b7759000-b7760000 r--s 00000000 08:03 3543520    /usr/lib/gconv/gconv-modules.cache
b7760000-b7761000 rw-p 00000000 00:00 0 
bfb07000-bfb28000 rw-p 00000000 00:00 0          [stack]
The program has unexpectedly finished.
/home/chen/qt/caculator-build-desktop/caculator exited with code 0

我的解答思路和尝试过的方法

求各位帮我找找错误啦~~

我想要达到的结果

只想做个简单的计算器,可以做加减乘除而已~~

free()报错,应该是QString或者Stack的pop函数出错了
while循环 opt[i] !='\0' || s_opt.empty() != true这两个逻辑表达式你想想能不能一起放在while条件中。
另外,你的while循环中,if中,处理0-9的地方就只处理0-9,不要在处理0-9的后面再去判断下一个字符是否也是0-9,这样你的逻辑容易出错(你贴出来的15-19行代码)

38行pop->top即可;
类似的问题一定是等号的函数中出现了很低级的错误!!!