基于C ++范围的for循环给出SIGABRT,而正常循环工作正常

时间:2017-01-03 01:27:18

标签: c++ qt c++11 for-loop

此代码可以正常工作:

for (int i = 0; i < grid.size(); i++)
    painter.drawRect(grid[i].rect);

此代码不起作用:

for (Square square : grid)
    painter.drawRect(square.rect);

在运行时打印失败:

  

在抛出&#39; std :: bad_alloc&#39;的实例后终止调用   what():std :: bad_alloc程序意外结束。

这是调用堆栈:

1  raise
0x7ffff53cf91f 
2  abort
0x7ffff53d151a 
3  __gnu_cxx::__verbose_terminate_handler()
0x7ffff5f3f52d 
4  ??
0x7ffff5f3d2d6 
5  std::terminate()
0x7ffff5f3d321 
6  __cxa_throw
0x7ffff5f3d539 
7  operator new(unsigned long)
0x7ffff5f3dafc 
8  __gnu_cxx::new_allocator<Square>::allocate
new_allocator.h 104 0x408548       
9  std::allocator_traits<std::allocator<Square>>::allocate
alloc_traits.h  416 0x408308       
10 std::_Vector_base<Square, std::allocator<Square>>::_M_allocate
stl_vector.h    170 0x407f54       
11 std::_Vector_base<Square, std::allocator<Square>>::_M_create_storage
stl_vector.h    185 0x407b99       
12 std::_Vector_base<Square, std::allocator<Square>>::_Vector_base stl_vector.h    136 0x4078f3       
13 std::vector<Square>::vector
stl_vector.h    322 0x4075c3       
14 Square::Square
square.h        19  0x407406       
15 Canvas::Canvas
canvas.cpp      23  0x406752       
16 MainWindow::MainWindow
mainwindow.cpp  10  0x4044b6
main.cpp        7   0x404310       

问题发生在canvas.cpp

请澄清可能导致此问题的原因。

1 个答案:

答案 0 :(得分:3)

你正在尝试的两个循环根本不相同。第一个使用grid[i][]的{​​{1}}运算符会向向量中的元素返回vector,而不是它的副本。第二个版本使用基于范围:但是您编写它的方式reference,您要求它为每个元素生成for(Square square : grid并将其放在变量copy中。< / p>

您的square对象似乎是一个繁重的对象,或者它的复制构造函数存在一些问题,导致Square。但是,由于第一个版本运行良好,为了完成相同的操作,您需要基于范围来处理引用,而不是每个元素的副本:

bad_alloc

甚至最好只要对元素所需的操作足够,就返回for (Square& square : grid) // <-- return a reference on each element. painter.drawRect(square.rect);

const ref