2016-06-29 8 views
0

私の質問は:この例のような範囲ベースのループを使用すると、 'vec'に格納されている各 'Object'のヒープ上のメモリを解放していますか?私はこれが単にポインタをコピーして、コピーされたポインタを解放しようとしていると思っていました。範囲ベースのループ

私は 'obj:vec'はポインタへの参照を 'obj'と宣言していて、 'vec'に格納されている各オブジェクトのアドレスを割り当ててメモリが解放され、 to nullptr。これは正しいですか?

std::vector <Object*> vec; 
vec.push_back(new Object{}); 
vec.push_back(new Object{}); 
//.... 

//clean up 
for(auto *& obj : vec) 
    delete obj, obj = nullptr; 
+0

これは、ベクターをクリーンアップする方法ではありません。それはそれ自身のメカニズムを持っています。ポインタのベクトルが本当に必要ですか? RAIIを使用する –

+0

ポインタの代わりにオブジェクトを使用すると、ベクターが有効範囲外になったときに自動的にクリーンアップされるか、ベクターの空の関数が呼び出されます –

+2

コードがうまく見えます。文体的な観点から、私はむしろ '{delete obj; obj = nullptr; } '。 –

答えて

2
std::for_each(vec.begin(), vec.end(), [](Object* pt){delete pt; pt = nullptr;}); 

これは動作するはずです。

+1

'pt = nullptr;'部分は何も役に立ちません。 –

+0

それは自動的にnullptrに設定されていません(C++標準の一部ではありません)。そして、すでにクリアされていて、再利用が自由であるメモリを指す非nullポインターのベクトルを持つことは決して良い考えではありません。他のビットのコード。 – cplusplusrat

+0

すべてtrueですが、関数のローカル変数を 'nullptr'に設定していますが、' vec'にはまだ 'delete'dポインタが含まれています。 –

3

この例のように範囲ベースのループを使用すると、 'vec'に格納されている各 'オブジェクト'のヒープ上にメモリが解放されていますか?

はい。

これは単にポインタをコピーしてから、コピーしたポインタを解放しようとしていると思いました。

ポインタをコピーしません。しかし、ポインタのコピーを削除することは、ポインタを削除することと同じことです。そのため、指し示されたオブジェクトが破棄されるかどうかに違いはありません。削除後の割り当てで元のポインタがnullに設定されているかどうかは異なります。 、「OBJ」ポインタへの参照を宣言し、そのメモリが解放され、それに対して「VEC」に記憶された各オブジェクトのアドレスを割り当てている:I「はVEC自動* & objが」信じ

nullptrに設定します。これは正しいですか?

これはほとんど正しいです。しかし、私たちがペダンシーであれば、そのコードはvecに格納された各オブジェクトを参照に割り当てます。これは、vecに格納されているオブジェクトがObjectインスタンスのアドレスであるためです。

コードが何をしているかを明確にする必要がありますが、あまり良くないとは言えません。この場合は、あなたがautoを使用していないから利益を得ることができる:

for(Object*& obj : vec) { 
    delete obj; 
    obj = nullptr; 
} 

また、それがnullポインタのベクトルを保存することは理にかなっているかどうかを検討します。ポインタをヌルに設定しないことをお勧めしますが、単にポインタを完全に削除することをお勧めします。

for(Object* obj : vec) 
    delete obj; 
vec.clear(); 

かなり明確ですね。

+0

はい、そうです。ありがとうございました。 –

関連する問題