を介してオブジェクトを作成し、new
後でオブジェクトが設定されたら std::list にポインターを追加します。
メモリリークを起こさずにポインタを削除してリストからデータを消去する正しい方法は何ですか?
を介してオブジェクトを作成し、new
後でオブジェクトが設定されたら std::list にポインターを追加します。
メモリリークを起こさずにポインタを削除してリストからデータを消去する正しい方法は何ですか?
要素を検索するための手動ループの代わりに、私はむしろ使用したいstd::find_if
auto it = std::find_if(lst.begin(),
lst.end(),
[&val](datalist const &d) { return d.index == val; });
if ( it != lst.end() )
{
delete *it;
lst.erase(it);
}
それはあなたがそれを間違ってやっているということではありません。
std::unique_ptr
ただし、、、またはBoostのスマートポインタなどの何らかの形式のスマートポイントの使用を検討すると、コードは改善されますstd::shared_ptr
。その場合、メモリを自分で管理する必要はありません。
ポインターの代わりにインスタンスstd::list
を保持するように変更すると、手動でインスタンスを取得する必要がなくなります。(さらに言えば、その他の STL コンテナー)から要素を削除すると、要素のデータは自動的に解放されます。要素がデストラクタが定義されたクラス/構造体である場合、デストラクタが呼び出されます。datalist
datalist*
delete
datalist
std::list
これを試して:
std::list<datalist> m_DataList;
.
datalist AR; // <-- local variable on the stack, freed when out of scope
AR.index = ...;
AR.number = ...;
mylist.push_back(AR); // <-- pushes a copy-constructed instance of the variable
.
std::list<datalist>::iterator Iter1 = m_DataList.begin();
while(Iter1 != m_DataList.end())
{
if (Iter1->index == m_SomeVar)
{
m_DataList.erase(Iter1); // <-- copied datalist instance is freed automatically
break;
}
++Iter1;
}