在C ++ 17之前,从映射中删除所有指针的方式如下:
for (TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
{
if (NULL != it->second)
{
delete(it->second);
}
}
m_map_buff_on_attrs.clear();
有了C ++ 17,我们得到了:
for (auto it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
{
if (NULL != it->second)
{
delete(it->second);
}
}
有没有更简单的解决方案?
答案 0 :(得分:4)
是的
for (auto it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
由于仅使用值*it
,并且没有来自该迭代器的其他数据,因此for-range循环会更简单。
if (NULL != it->second)
{
delete(it->second);
}
删除NULL
的定义很明确,没有任何效果,这是您可以跳过的测试。
哪个给:
for (auto& p : m_map_buff_on_attrs) {
delete p.second;
}
处理原始指针容易出错,并使您编写更多无用的代码。如果m_map_buff_on_attrs
是智能指针的映射,则您的代码将仅仅是:
} // m_map_buff_on_attrs goes out of scope and destroys and frees everything.
答案 1 :(得分:3)
RAII模式是你的朋友:
using TMapBuffOnAttrs = std::map<std::string, std::unique_ptr<Attr>>;
m_map_buff_on_attrs["attrName"] = std::make_unique<Attr>(x, a);
....
// loop is not needed, to delete just do:
m_map_buff_on_attrs.clear();
答案 2 :(得分:1)
您可以将for_each
与lambda
功能一起使用。
这是一种方法:
std::for_each(m_map_buff_on_attrs.begin(), m_map_buff_on_attrs.end(),
[](auto &item) {delete item.second;});
答案 3 :(得分:0)
是的,请使用智能指针。然后简单地'clear()'容器... 否则,这仅仅是“用C ++ 17编写的C代码”