2015-12-29 120 views
2

我正在使用Qt框架在C++中开发应用程序,但我需要读取.xslx文件才能将其导入到sqlite数据库中。我正在使用Qt Xlsx模块,但是我发现一些困难,因为我的程序在执行期间的某个随机点崩溃。该文件大约有1500行和10列。我能够读取700和1000行之间,但然后崩溃。我认为这是一个内存问题,但我无法使用Valgrind,因为我在Mac OS X系统上。 我的代码的相关部分如下。使用C++ Qt和Qt Xlsx模块读取“Large”xlsx文件

void Controller::ImportDatabase(const QString &filepath) 
{ 
    QStringList* person_fields = new QStringList; 

    QXlsx::Document *xlsx_database = new QXlsx::Document(filepath); 

    int number_of_row = xlsx_database->dimension().lastRow(); 
    int number_of_column = xlsx_database->dimension().lastColumn(); 


    for (int row = 2; row <= number_of_row; ++row) { 
     ++count; 
     qDebug() << "count: " << count; 
     for(int column = 0; column < number_of_column ; ++column) { 
      if ((QXlsx::Cell *cell = xlsx_database->cellAt(row, column))) { 
       person_fields->append(cell->value().toString()); 
       delete cell; 
      } 
     } 
     qDebug() << "NOME: " << person_fields->at(0); 

     //Create a new Person and pass its pointer around: all commented anyway 

     person_fields->clear(); 
     delete cell; 
    } 
    delete person_fields; 
    delete xlsx_database; 
} 

任何意见或建议将不胜感激。

+1

您是否尝试过最基本和最直接的方法?获取Qt和XLSX模块的调试版本,然后在调试器中运行它并查看崩溃的位置。 –

+1

1.我认为没有必要在堆上构建person_fields和xlsx_database,堆栈应该足够了。 2.你真的需要从cellAt中删除单元格指针吗?在循环中还有另一个“删除单元格”,看不到这个编译过程是怎样的... 3. person_fields-> at(0);如果没有添加到QStringList中,可能会导致问题。4. Kuba Ober说:调试! – CppChris

回答

1

您必须不要删除cell因为它归QXlsx :: Document所有。

+0

我注意到,如果我不删除它,事情会变得更好。但问题仍然存在。 – jack