簡體   English   中英

Qt程序崩潰與另一個編譯器

[英]Qt Program crashes with another compiler

誰能告訴我這部分代碼有什么問題嗎? 執行期間崩潰。

void MainWindow::on_pushButton_clicked()
{
char * cstr = new char [ui->lineEdit->text().length()];
       string costam;
       costam=ui->lineEdit->text().toStdString();
       strcpy(cstr, costam.c_str()); <<<----TROUBLE LINE
       int z;
       z=costam.length();
       for(int n=0;n<z;n++){
            string wynik;
            wynik=konwersja(cstr[n]);
            mors(wynik);
            Sleep(300);
           }
   delete[] cstr;
   }

當我嘗試在Qt 5.0.1中使用MinGW進行編譯時,一切正常,但是在Qt 4.8.1中使用MSVC2010進行編譯時,出現警告:

警告C4996:'strcpy':此函數或變量可能不安全。 考慮改用strcpy_s。 要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。 詳細信息請參見在線幫助。

您的問題是錯的。 這段代碼可以編譯,這里沒有關於QT的內容。

不建議使用strcpy ,因為它不安全。 替代方法是strcpy_s

strcpy_s( cstr, ui->lineEdit->text().length() + 1, costam.c_str() );

請注意,您應該分配ui->lineEdit->text().length() + 1 ,而不是ui->lineEdit->text().length() 我猜這就是崩潰的原因。

順便說一句,我認為根本沒有理由在您的代碼中使用cstr數組。 例如:

void MainWindow::on_pushButton_clicked() {
    string costam;
    costam = ui->lineEdit->text().toStdString();
    for( size_t n = 0; n < costam.length(); n++ ) {
        string wynik;
        wynik = konwersja( costam[ n ] );
        mors( wynik );
        Sleep( 300 );
        }
    }

您可以更改此行嗎? strcpy(cstr, costam.c_str()); strcpy_s(cstr, costam.c_str()); 嘗試再次編譯?

同樣,它也不應該阻止編譯,MSVC2010只是警告使用不安全。 您還可以降低MSVC2010的警告級別。

由於人們在編程C ++時並不十分了解安全性,並且Windows對此表示不滿,因此Visual Studio“棄用了”幾個導致緩沖區溢出的常見功能。 在這種情況下,您應該沒問題,並且可以通過定義_CRT_SECURE_NO_WARNINGS禁用警告。 posix函數也可能會出現此問題,在這種情況下,您可以使用單獨的#define禁用這些警告。

您在這里有兩個問題。

崩潰是因為strcpy會將length + 1字符寫入目標緩沖區,但是您的緩沖區只有size length +1是空終止符,不包含在length

警告是因為Microsoft認為使用strcpy容易出錯並且不鼓勵使用它。 如Joel所述,您可以啟用一個定義來防止該警告。 我不建議使用semihyagcioglu和Microsoft建議使用strcpy_s,因為它不是便攜式解決方案。

我還想指出,修復這些問題將使您的代碼得以編譯和運行而不會出錯,但還有其他問題。 就像:為什么首先需要cstr變量? cstr [n]可能可以替換為costam.data()[n]。 然后,cstr變量根本不需要存在。 您將不需要new,delete或strcpy。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM