【问题标题】:Qt Program crashes with another compilerQt 程序与另一个编译器崩溃
【发布时间】:2013-04-23 12:07:21
【问题描述】:

谁能告诉我这部分代码有什么问题?它在执行过程中崩溃。

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

【问题讨论】:

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


    【解决方案1】:

    你能把这行strcpy(cstr, costam.c_str());改成strcpy_s(cstr, costam.c_str());再编译一次吗?

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

    【讨论】:

      【解决方案2】:

      由于人们在编写 C++ 时对安全性不太了解,而 Windows 也因此而受到诟病,Visual Studio “弃用”了几个函数,这些函数是缓冲区溢出的常见原因。在这种情况下,您应该没问题,并且可以通过定义 _CRT_SECURE_NO_WARNINGS 来禁用警告。您也可能会在 posix 函数中发现此问题,在这种情况下,您可以使用单独的 #define 禁用这些警告。

      【讨论】:

      • 这可能会消除警告,但不会修复崩溃。我认为你的编辑有点冒昧。没有为空终止字符分配空间。如果他没有启用警告错误,程序可能会编译,它很可能会崩溃。
      • 他没有在问题中指出崩溃,只有标题。无论如何,这里根本没有关于 QT 的内容。
      • 对不起,我忘了在第一篇文章中告诉你,程序正在运行,但是当我尝试点击按钮时程序崩溃了
      • 那么我相信 Slavik81 有你的答案。
      • 也许有另一种方法可以在另一个函数中替换 strcpy(cstr, custom.c_str()) ,它会在输出时给我 char*?
      【解决方案3】:

      这里有两个问题。

      崩溃是因为 strcpy 会将length + 1 字符写入目标缓冲区,但您的缓冲区大小仅为length。 +1 用于空终止字符,length 中不包含该字符。

      警告是因为微软认为使用 strcpy 太容易出错,不鼓励使用它。正如乔尔所提到的,您可以启用定义来防止该警告。我不推荐 semihyagcioglu 和微软使用 strcpy_s 的建议,因为它不是一个可移植的解决方案。

      我还想指出,虽然修复这些问题将使您的代码编译和运行没有错误,但还有其他问题。比如:为什么你首先需要 cstr 变量? cstr[n] 可能可以替换为 costam.data()[n]。然后 cstr 变量根本不需要存在。您不需要 new、delete 或 strcpy。

      【讨论】:

        【解决方案4】:

        你的问题是错误的。这段代码可以编译,这里没有关于 QT 的内容。

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

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

        请注意,您应该分配ui-&gt;lineEdit-&gt;text().length() + 1,而不是ui-&gt;lineEdit-&gt;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 );
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2018-06-22
          • 1970-01-01
          • 1970-01-01
          • 2012-07-10
          • 2018-12-27
          • 2011-01-04
          • 2021-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多