1

を介してオブジェクトを作成し、new後でオブジェクトが設定されたら std::list にポインターを追加します。

メモリリークを起こさずにポインタを削除してリストからデータを消去する正しい方法は何ですか?

4

2 に答える 2

4

要素を検索するための手動ループの代わりに、私はむしろ使用したい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。その場合、メモリを自分で管理する必要はありません。

于 2012-06-01T17:00:05.883 に答える
3

ポインターの代わりにインスタンスstd::listを保持するように変更すると、手動でインスタンスを取得する必要がなくなります。(さらに言えば、その他の STL コンテナー)から要素を削除すると、要素のデータは自動的に解放されます。要素がデストラクタが定義されたクラス/構造体である場合、デストラクタが呼び出されます。datalistdatalist*deletedataliststd::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; 
} 
于 2012-06-01T18:43:19.397 に答える