2013-06-27 61 views
1

我有以下Qt代碼,其中段錯誤next()。我看着QtConcurrent的代碼,它對我來說並不明顯,爲什麼它失敗了。QFutureIterator :: next segfaults

namespace { 
    std::tuple<QString, std::exception_ptr> test(const int& data) { 
     return std::make_tuple(QString(), std::exception_ptr()); 
    } 
} 

void 
start() { 
    QVector<int> downloadList; 
    downloadList.push_back(1); 
    downloadList.push_back(2); 

    auto future = QtConcurrent::mapped(downloadList, test); 

    QFutureIterator<std::tuple<QString, std::exception_ptr>> it(future); 
    while(it.hasNext()) { 
     auto& tuple = it.next(); 
    } 
} 

失敗的一點是:

const T *pointer() const 
{ 
    if (mapIterator.value().isVector()) 
->  return &(reinterpret_cast<const QVector<T> *>(mapIterator.value().result)->at(m_vectorIndex)); 
    else 
     return reinterpret_cast<const T *>(mapIterator.value().result); 
} 

更新:

QFuture::const_iterator死機一樣。


注:

如果我能相信GDBthisQVector::at0x0。那麼我假設mapIterator.value().result已經是nullptr,爲什麼,我不知道。

+0

只是問......你確定你可以在QFuture完成之前在QFuture上使用迭代器嗎? – peppe

+0

根據[doc](http://harmattan-dev.nokia.com/docs/library/html/qt4/qfutureiterator.html#details),是的。 – abergmeier

回答

1

似乎Qt4文檔是錯誤的,但又一次(任何人都驚訝?)。至少我在迭代器中找不到對waitForResult(int)調用的引用。

直接使用resultAt是什麼工作。

所以,你將取代

for(auto it = future.begin(); it != future.end(); ++it) { 
    auto& result = *it; 

for(int i = 0; i != count; ++i) { 
    auto result = future.resultAt(i); 

,以防止其崩潰。

+0

我真的希望他們將'QFuture'基於_Qt6_中的'std :: future'。 – abergmeier