2016-04-28 6 views
-1

は、ここで私はリスト内のオブジェクトを正しく削除するには?

私は機能だけで完全にフリーリストのことができるように、それは

私が見てきた、削除することで、新たな表示可能オブジェクトを置きたいと思う私のリスト

list<DisplayableObject> objects; 

です消去など、私は明示的にそれらのクラスの関数は実際にメモリを解放しないようにする必要があると言う人々は、オンラインで読むとき?彼らが正しいかどう

私はいくつかのアプローチとは考えて作りました:

iter = objects.begin(); 
while (!objects.empty()) { 
    objects.remove(*iter); 
} 
objects.clear(); 
while (!objects.empty()) { 
    delete &objects.front(); 
    objects.pop_front(); 
} 
objects.clear(); 
while (!objects.empty()) { 
    delete &iter; 
    iter++; 
} 
objects.clear(); 

もっと良いアプローチはありますか?ありがとう

+0

「正しいかどうかわからない」とはどういう意味ですか?サイズはあらかじめご確認の上、サイズは?あらかじめオブジェクトを印刷してから、正しいオブジェクトが削除されたかどうかを確認しましたか? – Tas

+0

メモリが適切に解放されているかどうかわかりません。もっと簡単な方法があれば –

+0

'std :: list'を意味しますか?それから 'clear()'だけです。 – songyuanyao

答えて

2

あなたは2つの異なるものが混在しています。のは、整数ポインタのstd::listを見てみましょう、とこのようにそれらを初期化します。

std::list<int *> list; 

list.push_back(new int[7]); 
list.push_back(new int[5]); 

この時点で、

list.clear(); 

を行うことは完全にリストの要素を削除します。しかし、リストの要素は整数へのポインタであり、実際に指しているデータとは完全に別です。データは解放されません。

for (auto &item:list) 
     delete[] item; 
list.clear(); 

std::listは、リスト内の値を削除するための唯一の責任がある:それは事前にdelete[]それをするあなたの責任です。 std::listには、リストにポインタが含まれている場合、ポインタが何を指しているかについての知識がありません。たとえば、同じ正確なリストの場合:

std::list<int *> list; 

int a; 
int b; 
list.push_back(&a); 
list.push_back(&b); 

このリスト自体は、最初のものと同じ正確なリストです。それはまだ整数へのポインタのリストです。この場合、

list.clear(); 

ここで行う必要があるのは唯一のことです。ポインタはnew -edオブジェクトへのポインタではありません。 C++開発者としては、あなたのnewが何であるか、そしてそれがもはや必要でないときはdeleteを追跡するのはあなたの責任です。

これは絶対に必要な場合を除き、生かされていない純粋なポインタを使用したくない理由です。代わりに、std::shared_ptrを使用すると、不要になったときにnew edオブジェクトが自動的にdeleteになります。代わりに

class SomeClass {}; 

std::list<SomeClass *> list; 

のあなたは(より良い例えば、代わりにここでintの、クラスを使用して)

std::list<std::shared_ptr<SomeClass>> list; 

を使用し、場合。尖った-にクラスのメンバーは、もはや他のスマートポインタによって参照されているならば、とき

list.clear(); 

、その後、彼らは自動的にdelete Dになることはありません。

+1

共有所有権が実際に必要な場合を除き、 'shared_ptr'の代わりに' unique_ptr'を使う方が良いです - 後者は参照カウントを維持するオーバーヘッドを招きます。 – Wyzard

+0

ありがとう、非常に役立つ –

1

あなたがしなければならないのは、objects.clear()を呼び出すことだけです。あなたのリストはオブジェクトで構成されています(DisplayableObjectは単にオブジェクトでありポインタではないと仮定しています)ので、各オブジェクトのデストラクタが呼び出され、リストは空になります。

単純にオブジェクトを格納するのではなく、リスト内のオブジェクトへの単純なポインタを格納していた場合、objects.clear()を呼び出す前に明示的にリストの各要素を解放する必要があります。解放されたポインタのリスト。

+0

申し訳ありません私はその愚かなので、tihs質問を削除するつもりです。 –

関連する問題