如何正确删除std :: list中的指针?

时间:2012-06-01 16:42:19

标签: c++ list pointers delete-operator

我正在通过new创建一个对象,然后在设置对象后将指针添加到std :: list。

删除指针并从列表中删除数据而不会导致内存泄漏的正确方法是什么?

2 个答案:

答案 0 :(得分: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_ptrstd::shared_ptr或boost的智能指针),您的代码就会得到改善,那么您就不必自己管理内存。 / p>

答案 1 :(得分:3)

如果您将std::list更改为保留datalist个实例而不是datalist*个指针,那么您不必手动delete datalist个实例。当您从std::list(或任何其他STL容器)中删除元素时,将自动为您释放元素的数据。如果元素是定义了析构函数的类/结构,则将调用析构函数。

试试这个:

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; 
}