迭代器触发Visual C ++ 2017断言

时间:2018-09-23 03:45:29

标签: c++ visual-studio c++11 stl visual-studio-2017

我已将Mark Borgerding的kissfft.hh(他的FFT代码的模板版本)复制到我的项目中,并将其修改为使用迭代器而不是指针。使用Xcode一切都很好。当我尝试使用Microsoft的Visual C ++ 2017编译后运行它时,我从以下代码获得断言错误:

if (leftInset > 0) {
     return UIEdgeInsetsMake(0, leftInset, 0, rightInset)
  } else {
     return UIEdgeInsetsMake(0, 10, 0, 10)
}

void transform(ComplexIterator fft_in, ComplexIterator fft_out) const { ComplexIterator const Fout_beg = fft_out; ComplexIterator const Fout_end = fft_out + p*m; do{ *fft_out = *fft_in; fft_in += fstride; }while(++fft_out != Fout_end ); ... 是模板类型,在这种情况下,它是普通ComplexIterator。有时std::vector< std::complex<float> >::iterator指向Fout_end中间的某个地方,有时它指向std::vector中最后一个元素之后的一个点,就像std::vector一样。当它指向最后一个元素之后的一个点时,std::vector.end()语句会导致断言错误,因为迭代器经过了向量中的最后一个元素。它只过去了一个(即等于while),但这没关系。

问题是,我认为这是迭代器的标准做法。您将不断进行迭代,直到您到达Fout_end之外的“ end”为止。我创建了一个简单的测试程序来检查它是否也触发了断言检查。

std::vector

不是。这里发生了什么?为什么FFT代码会使断言检查失败?我可以通过切换到“发布”模式来解决问题,然后一切正常,但是我想知道我做错了什么。

1 个答案:

答案 0 :(得分:0)

原来是@ n.m。完全正确-问题是fft_in而不是我想的fft_out。我展开了do...while循环的最后一次迭代,以避免该问题,而又不增加性能成本(我认为)。

 ComplexIterator const Fout_beg = fft_out;
 ComplexIterator const Fout_end = fft_out + p*m;

 ComplexIterator const Fout_almost_end = Fout_end - 1;
 do{
     *fft_out = *fft_in;
     fft_in += fstride;
 }while (++fft_out != Fout_almost_end);
 *fft_out = *fft_in;