我有一些指向某些粒子對象的指針數組:Particle* particles[ TOTAL_PARTICLES ];
其中TOTAL_PARTICLES = 10;
。動態創建的對象顯示爲nullptr使用基於範圍的for循環
當我運行下面這段代碼,
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(Particle* p : particles)
替換爲for(int i = 0; i < TOTAL_PARTICLES; ++i)
,並將第二個for循環保留爲基於範圍的for循環,則代碼將按預期工作。
有沒有人有任何想法,爲什麼指向粒子的指針數組突然變爲nullptr?還有一點需要注意:我嘗試迭代指針數組而不實際創建任何粒子,並且我也收到了類似的輸出,這讓我懷疑第一個基於範圍的for循環中的代碼不在不知何故「保存」。