1. 程式人生 > >Qt編譯錯誤:底層由於接收到作業系統的訊號而停止

Qt編譯錯誤:底層由於接收到作業系統的訊號而停止

    double vec = ((m_game->startpos-endPos)*4).length();
/*    char Info[24];
    sprintf(Info,"%0.2f",sqrt(vec));
    m_lable->setText(QString(Info));*/
    double vec = ((m_game->startpos-endPos)*4).length();
    m_lable->setText(QString("%1").arg(sqrt(vec)));
*** stack smashing detected ***: /home/**/桌面/build-******-Desktop_Qt_5_10_0_GCC_64bit-Debug/***** terminated

在Qt,寫程式碼時,遇到記憶體洩漏,崩潰的問題。當時定位了很久,因為是偶爾出現,不穩定。後來發現了一些規律。需要規避,也沒有想明白為什麼為出現這個問題。

第一種寫法,字串拼接,用的VC,單純C++以前的寫法,沒有用Qt自帶的QString操作,一直以為沒有問題,這次使用時,經常會記憶體洩漏,沒有明白。

查了一下:sprintf不是型別安全的,在執行的時候,它不會檢查陣列邊界。所以當給其格式化一個比其大小還長的字串時,就導致緩衝區溢位

                還找到一個函式:sprintf_s()是sprintf()的安全版本,通過指定緩衝區長度來避免sprintf()存在的溢位風險