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

标签 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 循环中的代码没有被以某种方式“保存”。

最佳答案

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

请注意,p 是一个Particle*。这意味着您只是将指针复制出数组,因此赋值将不会更改数组。

您可以改为引用指针:

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

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

关于c++ - 使用基于范围的 for 循环动态创建的对象显示为 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923668/

相关文章:

C++字节序会影响fstream的读写功能吗?

c++ - C/C++ : Converting hexadecimal value in char to integer

c++ - 带有指针和唯一指针的 emplace_back

c++ - 指向固定大小数组的指针的析构函数

c++ - 模板成员函数重载问题

C++将函数指针分配给另一个

c - 如何改进我的算法来检测对应于相同分数的数组元素?

c++ - 检查相邻网格的最有效方法

Java - 基于第一列组织二维数组的问题

c++ - 包含相同类型的结构指针的结构指针的初始化