原始指针VS智能指针在C ++ 11 [重复]

问题描述 投票:0回答:2

这个问题已经在这里有一个答案:

我想知道我怎么能代替与智能指针我的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;
}

现在,这一切都很好。

问题是,我看到它来自一个事实,即在一个时间点,我可能需要删除Vector中的成员之一(该成员为用户指定的)。

现在,这是简单的:

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

但我怎么它与智能指针重新写?它甚至有可能?

c++ c++11 pointers smart-pointers
2个回答
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();
    }
}

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());

描述用于处理所有元素位,不过,你可以用它在功能摆脱锅炉板。

© www.soinside.com 2019 - 2024. All rights reserved.