首页 > 解决方案 > 使用 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);
    }
}

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

标签: c++refactoringc++17

解决方案


是的。

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.

推荐阅读