2017-11-19 8 views
-3

私はn-body問題の実装に取り​​組んでいます。構造体(小惑星)とそれらの構造体を含むベクトルを作成する必要があります。C++のvectorとstruct free

私の質問は、私はこのようなベクトルを作成する場合は、次のとおりです。

vector<asteroid> b(n_asteroids + n_planets); 

そして私はこのようにそれを埋める:

for (it = 0; it < n_asteroids + n_planets; ++it){ 
    b[it] = {arg1, arg2, arg3...} 
} 

私は小惑星のいずれかにを削除を呼び出す必要があります構造体またはベクトル?または、デストラクタは私のプログラムがメインとなったときに解放しますか?

ありがとうございます!

+1

いいえ「新規」、「削除」はありません。心配はありません:) – Quentin

答えて

2

あなたのベクターには自動的な記憶クラスがあります。これは、それが占有するメモリが範囲外になると解放されることを意味します。つまり、ベクターの内容も解放されます。

ベクトルが動的に指し示すポインタを保持している場合は、deleteの必要があります。

+0

はい、小惑星は構造体です。それでは、メモリリークの原因になりませんか? – Halo

+0

全くありません。ベクタが "死"すると(スコープ/実行が終了すると)、メモリは解放されます。ポインタを使用した場合、これは当てはまりません! (ベクトル b(n_asteroids + n_planets);) – CIsForCookies

+0

このベクトルは構築時に既に小惑星でいっぱいです。 – juanchopanza

2

ベクターを削除する必要はありません。新しいベクターを使用しないので、ベクターを削除する必要はありません。ベクター部材について、http://www.cplusplus.com/reference/vector/vector/~vector/

からこれが格納されている要素のそれぞれに破壊:: allocator_traitsを呼び出し、そのアロケータを使用して、ベクターによって割り当てられたすべてのストレージ容量の割り当てを解除します。

あなたの答えはノーです。 しかし、あなたのベクトルにポインタを保持している場合は注意してください。 vector<asteroid *>、これはnewで割り当てられましたが、このポインタに残っている参照はありません。手動で削除する必要があります。

+1

すべてのポインタでdeleteを呼び出す必要はありません。 – juanchopanza

+1

どのケースが必要かを明確にしました – OriBS