此代码可以正常工作:
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
请澄清可能导致此问题的原因。
答案 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