我正在通过 创建一个对象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);
}
这并不是说你做错了。
但是,如果您考虑使用某种形式的智能点(例如 、 或 boost 的智能指针),您的代码将会得到改进std::unique_ptr
,std::shared_ptr
那么您不必自己管理内存。
如果您更改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;
}