这个问题已经在这里有一个答案:
我想知道我怎么能代替与智能指针我的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;
}
}
但我怎么它与智能指针重新写?它甚至有可能?
这是一个与智能指针实际上更容易,在这里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();
}
}
是的,使用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());
描述用于处理所有元素位,不过,你可以用它在功能摆脱锅炉板。