あなたが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?
Doesn't erasing std::list::iterator invalidates the iterator and destroys the object?
あなたはポインタを保持しているので、 'NULL'を確認してください。あるいは 'std :: list'を使ってください。 –
juanchopanza
'std :: list'の代わりに 'std :: list 'を使うことにしたのはなぜですか? –
LihO
生ポインタを使用することは本当に必要ですか? –