使用を余儀なくされ、次のように定義されstd::list<T*> myList;
ているとしましょう。T
struct T
{
T(const char* cstr) : str(cstr){ }
std::string str;
};
次に、std::list::front
最初の要素にアクセスするために使用します。
std::string firstStr = myList.front()->str;
myList.front()
この場合、リスト内の最初の要素への参照を返すことに注意してください。これは、この場合はポインターへの参照です。したがって、最初の要素へのポインターのように扱うことができます。
そして、あなたの質問にNULL
: ポインターのコンテナーを使用する場合、オブジェクトが破棄されたら、コンテナーからポインターを削除する必要があります。ポインターの使用を開始すると、通常、これらのポインターが指すオブジェクトに関連するメモリ管理を担当することになります (これが、可能な限り常によりも優先std::list<T>
する主な理由です)。std::list<T*>
NULL
ポインターよりもさらに悪いのは、ぶら下がっているポインターです。オブジェクトを作成するときに、そのアドレスをコンテナーに保存しますが、オブジェクトが破棄された後、このアドレスをコンテナーから削除しないと、このポインターが無効になり、メモリにアクセスしようとします。このポインターが指すと、未定義の動作が発生します。したがって、ポインタstd::list
が含まれていないNULL
ことを確認するだけでなく、まだ存在する有効なオブジェクトへのポインタのみが含まれていることも確認する必要があります。
したがって、これらの要素をクリーンアップするときまでに、リストからポインターを削除し、それらが指しているオブジェクトを一度に削除していることに気付くでしょう。
std::list<T*> myList;
myList.push_back(new T("one"));
myList.push_back(new T("two"));
myList.push_back(new T("three"));
myList.push_back(new T("four"));
while (!myList.empty())
{
T* pT = myList.front(); // retrieve the first element
myList.erase(myList.begin()); // remove it from my list
std::cout << pT->str.c_str() << std::endl; // print its member
delete pT; // delete the object it points to
}
次の質問も読む価値があります:
Can you remove elements from a std::list while iterating through it?
std::list::iterator を消去するとイテレータが無効になり、オブジェクトが破棄されませんか?