使用C ++ 17功能可以更好地删除容器中的所有指针

时间:2019-02-25 15:44:59

标签: c++ refactoring c++17

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

有没有更简单的解决方案?

4 个答案:

答案 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_eachlambda功能一起使用。

这是一种方法:

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代码”