【问题标题】:QT crashes when trying to change a string from a class尝试更改类中的字符串时 QT 崩溃
【发布时间】:2013-01-07 20:37:45
【问题描述】:

这是我的脚本:

void FileOperations::SetInputFile(QString x){
    InputFilename=x.toStdString();
}
void FileOperations::SetOutputFile(QString x){
    OutputFilename=x.toStdString();
}

尝试将 InputFilename 设置为 x 时,第一个 (SetInputFile) 崩溃。 第二个工作正常。

这是我要更改这两个字符串的类:

class FileOperations
{
public:
    void SetInputFile(QString x);
    void SetOutputFile(QString x);
private:
    string InputFilename;
    string OutputFilename;
};

如您所见,'InputFilename' 和 'OutputFilename' 是相同的,它们的功能也几乎相同。 我尝试将字符串更改为不同的名称,但它仍然崩溃。

崩溃后,我可以按调试,并在 Microsoft Visual Studio 2010 中查看错误,这是崩溃信息:

msvcr100d.dll!operator delete(void * pUserData) 第 52 行 + 0x3 字节 C++ ShitLEncoder.exe!std::allocator::deallocate(char * _Ptr, unsigned int __formal) 第 182 行 + 0x9 字节 C++ ShitLEncoder.exe!std::basic_string,std::allocator >::_Tidy(bool _Built, unsigned int _Newsize) Line 1998 C++ ShitLEncoder.exe!std::basic_string,std::allocator >::assign(std::basic_string,std::allocator > && _Right) 第 722 行 C++ ShitLEncoder.exe!std::basic_string,std::allocator >::operator=(std::basic_string,std::allocator > && _Right) 第 710 行 C++ ShitLEncoder.exe!FileOperations::SetInputFile(QString x) 第 8 行 + 0x26 字节 C++ ShitLEncoder.exe!MainWindow::on_OpenButton_clicked() 第 20 行 C++ ShitLEncoder.exe!MainWindow::qt_static_metacall(QObject * _o, QMetaObject::Call _c, int _id, void * * _a) 第 72 行 + 0x8 字节 C++ ShitLEncoder.exe!MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void * * _a) 第 106 行 + 0x15 字节 C++ Qt5Cored.dll!615820e0()
[以下帧可能不正确和/或丢失,没有为 Qt5Cored.dll 加载符号]
Qt5Cored.dll!615c613f()
Qt5Cored.dll!615c5ac1()
Qt5Widgetsd.dll!66a7118b()
Qt5Widgetsd.dll!66727087()
Qt5Widgetsd.dll!6672703b()
Qt5Widgetsd.dll!66728092()
Qt5Widgetsd.dll!66629ef5()
Qt5Widgetsd.dll!66624c40()
Qt5Widgetsd.dll!665e0887()
Qt5Widgetsd.dll!66625405()
Qt5Widgetsd.dll!6665de30()
Qt5Widgetsd.dll!665f15a0()
Qt5Widgetsd.dll!665e0253()
msvcr100d.dll!_free_dbg(void * pUserData, int nBlockUse) 第 1267 行 + 0xc 字节 C++ 0246b188()

它在代码中显示的第一件事是:

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

我正在使用 QT 5 和 QT Creator。

[编辑] 下面是 QT 主窗口类用来调用这些函数的代码:

void MainWindow::on_OpenButton_clicked()
{
    ui->OpenText->setText(QFileDialog::getOpenFileName(this, tr("Open File"),"",tr("Any                               file")));
    FileController->SetInputFile(ui->OpenText->text());
}

void MainWindow::on_SaveButton_clicked()
{
    ui->SaveText->setText(QFileDialog::getSaveFileName(this, tr("Save File"),"",tr("Any     file")));
    FileController->SetOutputFile(ui->SaveText->text());
}

【问题讨论】:

  • FileOperations 是否位于除主窗口之外的另一个文件夹中,通过 INCLUDEPATH 找到?
  • FileOperations 是一个单独的类,但它不在单独的文件夹中。

标签: qt qt-creator


【解决方案1】:

好的,我修复了它,我不确定它是如何工作的,我改变了这个:

class FileOperations
{
public:
    void SetInputFile(QString x);
    void SetOutputFile(QString x);
private:
    string InputFilename;
    string OutputFilename;
};

到这里:

class FileOperations
{
public:
    void SetInputFile(QString x);
    void SetOutputFile(QString x);
private:
    string UnusedVariable;
    string InputFilename;
    string OutputFilename;
};

我添加了一个额外的未使用变量,它停止了崩溃:D

【讨论】:

  • 所以你还是有这个问题。您提供的不是解决方案。
  • 如果“修复”了它,您可能只需要彻底清理和构建。
  • C++ 不能这样工作,所以如果它修复了,那么稍后可能会在您的代码中出现更糟糕的情况。你在哪里分配 FileController。向我们展示更多代码,因为在当前上下文中我们无法看到您在哪里犯了错误
  • 你知道堆和栈分配吗?你没有初始化你的 FileController。你必须先分配它!
  • 这是未定义的行为,所以它“有效”但它可能根本不起作用。阅读有关堆和堆栈的内容,您应该很快就会明白自己做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多