QFutureIterator :: next segfaults

时间:2013-06-27 14:59:12

标签: qt qt4 qtconcurrent

我有以下Qt代码,next()中的段错误。 我查看了QtConcurrent代码,这对我来说并不明显,为什么会失败。

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的同一次崩溃。


注意:

如果我能相信 GDB ,则this中的QVector::at0x0。然后我假设mapIterator.value().result已经是nullptr,为什么,我不知道。

1 个答案:

答案 0 :(得分: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 );

防止它崩溃。