2016-01-21 10 views
2

我有一些指向某些粒子對象的指針數組: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循環中的代碼不在不知何故「保存」。

回答

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

請注意,pParticle*。這意味着你只是將指針複製出陣列,所以賦值不是更改數組。

您可以改爲採取參考指針:

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

以指針引用意味着,當你分配給p,數組中的指針將被更新。

1

在基於範圍的循環中pparticles數組中的每個指針的副本。 所以在這個轉讓

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

什麼也沒有發生的particles陣列中的指針。

1

在第一個循環中,您不是分配給數組中的指針,而是分配給它們的臨時副本。
使用

for(Particle*& p : particles) 

代替。