使用const类型变量的for循环中的堆错误?

时间:2013-05-03 13:19:55

标签: c++ qt

对于刚练习,使用QT库我试图选择一个文件夹并列出该文件夹中的dicom文件的名称。以下是代码:

int main(int argc, char* argv[])
{


    QApplication app(argc, argv);
    QString fileName = QFileDialog::getExistingDirectory();


    if (fileName.isEmpty())
    {
        std::cout << "Got an empty file!\n";
    }
    else
    {
        QStringList nameFilter;
        QDir dir(fileName);
        nameFilter << "*.dcm";
        QFileInfoList list = dir.entryInfoList( nameFilter, QDir::Files );
        int numberOfFiles=list.count();

        for(int i=0;i<numberOfFiles;i++)
        {
            QString filena=list[i].fileName();
            string a=filena.toStdString();
            cout<<a<<endl;

        }
    }
   return 0;
}

在这里,我发现函数toStdString(实际上是std::string QString::toStdString () const)给出了Heap错误。我知道摆脱这个错误的替代是使用toLocal8Bit().constData(),但我很好奇是什么是toStdString提供的堆错误背后的主要原因。是因为它是const类型而且我的for循环每次尝试覆盖const变量吗?

3 个答案:

答案 0 :(得分:2)

您的代码看起来很好 - 确保您使用相同的编译器(以及使用相同的调试/发布配置)编译Qt的dll文件。

回答你的一些问题:

  

是因为它是const类型而且我的for循环每次尝试覆盖const变量吗?

不,你的for循环不会试图覆盖const变量。 const变量位于assingment运算符的右侧,因此for循环从const变量读取,并且它不会覆盖任何内容(您的a变量是可见的局部变量循环的块,因此a在循环的每次传递中都是不同的。)

即使您尝试覆盖const变量,也不会编译 - 尝试更改const将在编译时中断,而不是在运行时。

答案 1 :(得分:0)

  1. 此代码适用于我。
  2. 您最好不要将字符串转换为std::string并使用std::cout,而是使用QTextStream作为输出:

    QTextStream out(stdout);
    //...
    QString filena=list[i].fileName();
    out << filena << endl;
    

答案 2 :(得分:0)

我的钱是将Qt Framework的Debug版本与已编译程序的Release版本混合。

特别是在Windows下,在调试和发布版本中使用了不同的堆管理器。

尝试在调试模式下重新编译,看看会发生什么。