使用基于范围的 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?还有一件事需要注意:我尝试在不实际创建任何粒子的情况下迭代指针数组,并且我也收到了类似的输出,这让我怀疑第一个基于范围的 for 循环中的代码不知何故没有被"saved"不知何故。
在基于范围的循环中,p
是 particles
数组中每个指针的副本。
所以在这个作业中
p = new (nothrow) Particle( x, y );
particles
数组中的原始 指针没有任何变化。
在第一个循环中,您没有分配给数组中的指针,而是分配给它们的临时副本。
使用
for( Particle*& p : particles )
相反。
for( Particle* p : particles )
{
//...
p = new (nothrow) Particle( x, y );
//...
}
请注意 p
是 Particle*
。这意味着您只是将指针复制出数组,因此赋值将不会更改数组。
您可以改为引用指针:
for (Particle*& p : particles)
{
//...
}
引用指针将意味着当您分配给p
时,数组中的指针将被更新。
我有一个指向某些粒子对象的指针数组: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?还有一件事需要注意:我尝试在不实际创建任何粒子的情况下迭代指针数组,并且我也收到了类似的输出,这让我怀疑第一个基于范围的 for 循环中的代码不知何故没有被"saved"不知何故。
在基于范围的循环中,p
是 particles
数组中每个指针的副本。
所以在这个作业中
p = new (nothrow) Particle( x, y );
particles
数组中的原始 指针没有任何变化。
在第一个循环中,您没有分配给数组中的指针,而是分配给它们的临时副本。
使用
for( Particle*& p : particles )
相反。
for( Particle* p : particles )
{
//...
p = new (nothrow) Particle( x, y );
//...
}
请注意 p
是 Particle*
。这意味着您只是将指针复制出数组,因此赋值将不会更改数组。
您可以改为引用指针:
for (Particle*& p : particles)
{
//...
}
引用指针将意味着当您分配给p
时,数组中的指针将被更新。