c++ - 使用 C++17 功能更好地从容器中删除所有指针

标签 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);
    }
}

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

最佳答案

是的。

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.

关于c++ - 使用 C++17 功能更好地从容器中删除所有指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869863/

相关文章:

c++ - 我可以让静态函数继承每个类的特定值吗?

c++ - 如何在 C++ openCV 中使用树莓派摄像头作为视频输入?

c++ - 在 C++14 允许的情况下,C++17 是否禁止复制省略?

c++ - 将字符串文字传递给构造函数仅接受 std::string_view 的函数参数

c# - 阅读 C++ 代码 Create_Frame 函数(从 C# 的角度)

c++ - 关于在 C/C++/Assembly 中返回多个值

.net - 如何轻松找到未使用的公共(public)方法/属性

go - 如何重构语义重复

ruby - 我怎样才能更多地重构这个 ruby​​ 代码?

c++ - 无状态非常量值可用于常量表达式吗?