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

这并不是说你做错了。

但是,如果您考虑使用某种形式的智能点(例如 、 或 boost 的智能指针),您的代码将会得到改进std::unique_ptrstd::shared_ptr那么您不必自己管理内存。

于 2012-06-01T17:00:05.883 回答
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; 
} 
于 2012-06-01T18:43:19.397 回答