Qt程序与另一个编译器崩溃

时间:2013-04-29 17:55:47

标签: c++ qt visual-c++

有人能告诉我这部分代码有什么问题吗?它在执行期间崩溃。

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。有关详细信息,请参阅在线帮助。

4 个答案:

答案 0 :(得分:2)

你的问题是错的。这段代码编译,这里没有QT。

strcpy已弃用,因为它不安全。替代方案是strcpy_s

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

请注意,您应该分配ui->lineEdit->text().length() + 1,而不是ui->lineEdit->text().length()。我想这就是崩溃的原因。

BTW我认为没有理由在你的代码中使用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 );
        }
    }

答案 1 :(得分:1)

您可以使用strcpy(cstr, costam.c_str());再次尝试编译来更改此行strcpy_s(cstr, costam.c_str());吗?

此外,它不应该阻止编译,MSVC2010只是警告不安全的用法。您还可以降低MSVC2010的警告级别。

答案 2 :(得分:1)

因为人们在编程C ++时不太了解安全性,并且Windows因此而得到了不好的说法,所以Visual Studio“弃用”了几个导致缓冲区溢出的常见原因。在这种情况下,您应该没问题,并且可以通过定义_CRT_SECURE_NO_WARNINGS来禁用警告。您也可以使用posix函数找到此问题,在这种情况下,您可以使用单独的#define禁用这些警告。

答案 3 :(得分:1)

这里有两个问题。

崩溃是因为strcpy会将length + 1个字符写入目标缓冲区,但您的缓冲区只有length大小。 +1表示空终止字符,不包括在length中。

警告是因为微软认为使用strcpy很容易犯错误并且不鼓励使用它。正如Joel所提到的,您可以启用定义来阻止该警告。我不建议使用semihyagcioglu和微软建议使用strcpy_s,因为它不是一个可移植的解决方案。

我还要注意,虽然修复这些内容会使代码编译运行没有错误,但还有其他问题。喜欢:为什么你首先需要cstr变量? cstr [n]可能会被替换为costam.data()[n]。然后cstr变量根本不需要存在。您不需要new,delete或strcpy。