我有以下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::at
为0x0
。然后我假设mapIterator.value().result
已经是nullptr
,为什么,我不知道。
答案 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 );
防止它崩溃。