动态创建的对象使用基于范围的for循环显示为nullptr

时间:2016-01-21 12:20:02

标签: c++ arrays pointers for-loop nullptr

我有一些指向某些粒子对象的指针: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循环中的代码没有被保存&#34;不知。

3 个答案:

答案 0 :(得分:2)

for( Particle* p : particles )
{
    //...
    p = new (nothrow) Particle( x, y );
    //...
}

请注意,pParticle*。这意味着您只是将指针复制出数组,因此赋值将更改数组。

您可以改为引用指针:

for (Particle*& p : particles)
{
    //...
}

对指针的引用意味着当您分配给p时,数组中的指针将被更新。

答案 1 :(得分:1)

在基于范围的循环中,pparticles数组中每个指针的副本。 所以在这个作业中

p = new (nothrow) Particle( x, y );

particles数组中原始指针没有任何反应。

答案 2 :(得分:1)

在第一个循环中,您不是指定数组中的指针,而是指定它们的临时副本 使用

for( Particle*& p : particles )

代替。