我正在通过new
创建一个对象,然后在设置对象后将指针添加到std :: list。
删除指针并从列表中删除数据而不会导致内存泄漏的正确方法是什么?
答案 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_ptr
,std::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;
}