动态创建的对象使用基于范围的 for 循环显示为 nullptr
Dynamically created objects appear as nullptr using ranged-based for-loop
我有一个指向一些粒子对象的指针数组:Particle* particles[ TOTAL_PARTICLES ];
TOTAL_PARTICLES = 10;
在哪里。
当我在下面运行这段代码时,
for( Particle* p : particles )
{
cout << "Attempting to create particle!n";
p = new (nothrow) Particle( x, y );
cout << p << "n";
if ( p == nullptr )
{
cout << "Error assigning memory!n";
}
else
{
cout << "Particle created!n";
}
}
for( Particle* p : particles )
{
cout << "Nullptr? " << ( p == nullptr ) << "n";
}
这是输出:
Attempting to create particle!
0x2393c00
Particle created!
Attempting to create particle!
0x2393c20
Particle created!
Attempting to create particle!
0x2393c40
Particle created!
Attempting to create particle!
0x2393c60
Particle created!
Attempting to create particle!
0x2393c80
Particle created!
Attempting to create particle!
0x2393ca0
Particle created!
Attempting to create particle!
0x2393cc0
Particle created!
Attempting to create particle!
0x2393ce0
Particle created!
Attempting to create particle!
0x2393d00
Particle created!
Attempting to create particle!
0x2393d20
Particle created!
Nullptr? 0
Nullptr? 0
Nullptr? 0
Nullptr? 0
Nullptr? 1
Nullptr? 0
Nullptr? 1
Nullptr? 0
Nullptr? 1
Nullptr? 1
我不明白为什么,即使控制台告诉我所有粒子都已成功创建并且具有指向它们的非空指针,但当我再次迭代它们时,其中一些突然变为 nullptr。
最令人困惑的是,这只有在我使用基于范围的 for 循环时才会发生。如果我将第一个for( Particle* p : particles )
替换为 for( int i = 0; i < TOTAL_PARTICLES; ++i )
并将第二个 for 循环保留为基于范围的 for 循环,则代码将按预期工作。
有没有人知道为什么指向粒子的指针数组突然变成 nullptr?还有一件事需要注意:我尝试在不实际创建任何粒子的情况下迭代指针数组,并且我也收到了类似的输出,这让我怀疑第一个基于 ranged 的 for 循环中的代码以某种方式没有以某种方式"保存"。
for( Particle* p : particles )
{
//...
p = new (nothrow) Particle( x, y );
//...
}
请注意,p
是一个Particle*
。这意味着您只是将指针从数组中复制出来,因此赋值不会更改数组。
您可以改为引用指针:
for (Particle*& p : particles)
{
//...
}
引用指针意味着当您分配给 p
时,数组中的指针将被更新。
在基于范围的循环中,p
是 particles
数组中每个指针的副本。所以在这个作业中
p = new (nothrow) Particle( x, y );
particles
数组中的原始指针没有任何变化。
在第一个循环中,您不是分配给数组中的指针,而是分配给它们的临时副本。
用
for( Particle*& p : particles )
相反。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式