2013-05-03 1 views
3

Для практической работы с использованием библиотеки QT я пытаюсь выбрать папку и указать имя файлов dicom в этой папке. Ниже приводится код, который:Ошибка кучи в цикле с использованием переменной типа const?

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 каждый раз?

+4

Нет причин для получения «ошибки кучи» с этим кодом (что я вижу). Как проявляется эта «ошибка кучи»? – trojanfoe

+0

Ну а окно появляется, говоря 'Debug Assertion Не удалось! Программа: Programname.exe Файл: ..somepathlink \ dbgheap.c Line: 1322 Expression: _CrtIsValidHeapPointer (pUserData) ' –

ответ

2

Ваш код выглядит хорошо - убедитесь, что DLL файлы вашего Qt, скомпилированы с теми же компилятор (и с той же конфигурацией Debug/Release), которую вы используете.

Чтобы ответить на некоторые вопросы:

Это потому, что тип и Const моего цикла пытается перезаписать константные переменные каждый раз?

Нет, ваш цикл for не пытается переписать переменную const. Константная переменная находится в правой части оператора assingment, поэтому ваш цикл for , читающий из переменной const, и ничего не перезаписывает (ваша переменная a является локальной переменной, видимой внутри блока цикла, поэтому a отличается в каждом проход петли).

Даже если вы попытаетесь перезаписать переменную const, которая не будет компилироваться - попытка изменения const будет ломаться во время компиляции, а не во время выполнения.

0
  1. Этот код работает для меня.
  2. Вы бы лучше не преобразовывать строки в std::string и использовать std::cout, а использовать QTextStream для вывода:

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

Мои деньги будут смешаться с отладочными версиями Qt Framework с версиями Release вашей скомпилированной программы.

Специально под Windows в сборке отладки и выпуска используется другой менеджер кучи.

Попробуйте перекомпилировать в режиме отладки и посмотреть, что произойдет.

Смежные вопросы