具有非常量值的 C++ 数组索引
c++ array indexing with non-const value
我有以下代码:
DisplayObject conveyor_belts[] = {eggs_1, eggs_2, flour_1, flour_2, sugar_1, sugar_2, butter_1, butter_2};
std::thread conveyor_belts_t[4];
for (int j = 0; j < 4; j++) {
conveyor_belts_t[j] = std::thread([&](){
conveyor_belts[j * 2].draw(15, 78 + i * 3); // segmentation fault here
});
}
我为 displayObject 定义了一个复制构造函数,但是上面的代码在突出显示的行中给出了分段错误。我可以通过以下方式解决这个问题:
DisplayObject conveyor_belts[] = {eggs_1, eggs_2, flour_1, flour_2, sugar_1, sugar_2, butter_1, butter_2};
std::thread conveyor_belts_t[4];
for (int j = 0; j < 4; j++) {
conveyor_belts_t[j] = std::thread([&](){
conveyor_belts[0].draw(15, 78 + i * 3);
});
}
我想知道为什么变量索引会给我分段错误
在你的执行线程中
conveyor_belts[j * 2].draw(15, 78 + i * 3);
C++ 不保证新的执行线程将执行此代码并读取 通过引用捕获的值 j
在原始执行线程迭代 for
循环 并递增此处引用的 j
的值之前。 C++ 向您保证的是,新的执行线程在 std::thread
构建后的某个时刻开始执行 。这是您唯一的保证。
很有可能当所有执行线程唤醒时 for
循环已经完成迭代,并且所有四个执行线程都在愉快地查看它们捕获的对 j
的引用,这现在已经达到其最终值 4
,并且所有四个执行线程都将愉快地使用 j
的值,现在是 4
,因为它是通过引用捕获的。
我有以下代码:
DisplayObject conveyor_belts[] = {eggs_1, eggs_2, flour_1, flour_2, sugar_1, sugar_2, butter_1, butter_2};
std::thread conveyor_belts_t[4];
for (int j = 0; j < 4; j++) {
conveyor_belts_t[j] = std::thread([&](){
conveyor_belts[j * 2].draw(15, 78 + i * 3); // segmentation fault here
});
}
我为 displayObject 定义了一个复制构造函数,但是上面的代码在突出显示的行中给出了分段错误。我可以通过以下方式解决这个问题:
DisplayObject conveyor_belts[] = {eggs_1, eggs_2, flour_1, flour_2, sugar_1, sugar_2, butter_1, butter_2};
std::thread conveyor_belts_t[4];
for (int j = 0; j < 4; j++) {
conveyor_belts_t[j] = std::thread([&](){
conveyor_belts[0].draw(15, 78 + i * 3);
});
}
我想知道为什么变量索引会给我分段错误
在你的执行线程中
conveyor_belts[j * 2].draw(15, 78 + i * 3);
C++ 不保证新的执行线程将执行此代码并读取 通过引用捕获的值 j
在原始执行线程迭代 for
循环 并递增此处引用的 j
的值之前。 C++ 向您保证的是,新的执行线程在 std::thread
构建后的某个时刻开始执行 。这是您唯一的保证。
很有可能当所有执行线程唤醒时 for
循环已经完成迭代,并且所有四个执行线程都在愉快地查看它们捕获的对 j
的引用,这现在已经达到其最终值 4
,并且所有四个执行线程都将愉快地使用 j
的值,现在是 4
,因为它是通过引用捕获的。