C ++ 11中的原始指针与智能指针

时间:2019-02-06 21:04:44

标签: c++ c++11 pointers smart-pointers

我试图了解如何用智能指针替换C ++软件中的原始指针。

我有以下代码:

class Foo
{
private:
    std::vector<Bar *> m_member;
};

现在在某些函数中,我用以下命令填充该向量:

m_member.push_back( new Bar() );

当程序完成时,我使用以下命令删除内存:

for( std::vector<Bar *>::iterator it = m_member.begin(); it < m_member.end(); ++it )
{
    delete (*it);
    (*it) = NULL;
}

现在所有这一切都很好。

问题出在我看来,是因为我可能需要在某个时间点从向量中删除一个成员(该成员是用户指定的)。

现在这很简单:

for(...)
{
    if( (*it)->GetFieldFromBar() == <user_specified_condition> )
    {
        delete (*it);
        (*it) = NULL;
    }
}

但是如何使用智能指针重新编写它?甚至有可能吗?

2 个答案:

答案 0 :(得分:3)

使用智能指针实际上要容易得多,这里是unique_ptr

填充通过以下方式完成:

m_member.push_back(std::make_unique<Bar>()); // C++14, you can use std::unique_ptr<Bar>(new Bar) is you only have C++11

不需要析构函数。

对于自定义删除:

for(auto& p: m_member)
{
    if( p->GetFieldFromBar() == <user_specified_condition> )
    {
        p.reset();
    }
}

答案 1 :(得分:0)

是的,在这种情况下,使用std::vector<std::unique_ptr<Bar>>是理想的选择。您显然拥有向量的所有权。

向其中添加元素可以在c ++ 14中完成以下操作:

m_member.push_back( std::make_unique<Bar>() );

删除所有元素将减少为m_member.clear(),甚至只是使其超出范围。

有选择地删除元素最好这样做:

m_member.erase(std::remove_if(m_member.begin(), m_member.end(), [&](auto &&ptr) { return ptr->GetFieldFromBar() == <user_specified_condition>; }), m_member.end());

不过,对于处理所有元素有一些描述性,您可以将其包装在一个函数中以摆脱样板。