Boost.Assign:使用带有map_list_of的对象?

Use*_*ser 3 c++ boost stdmap

使用C++和boost.在Boost.Assign中,我可以将new运算符与map_list_of一起使用吗?

例如:

std::map<int, MyObject*> objects = boost::assign::map_list_of
       (1, new MyObject())(2, new MyObject())(3, new MyObject())
Run Code Online (Sandbox Code Playgroud)

如果没有,还有另一种方法吗?

epl*_*ess 5

它确实有效,是的; 调用new只返回一个指向MyObject的指针,它可以在任何类型有效的地方使用.但是,对new的调用可能会抛出异常,或者MyObject的构造函数可能会抛出异常,这意味着您的整个堆分配的MyObjects映射将被泄露.

如果您想要异常安全以及不必费心删除这些对象,则应使用智能指针代替:

std::map<int, boost::shared_ptr<MyObject> > objects = boost::assign::map_list_of<int, boost::shared_ptr<MyObject> >
    (1, new MyObject())
    (2, new MyObject())
    (3, new MyObject());
Run Code Online (Sandbox Code Playgroud)

  • 这段代码仍然不是例外; 在执行`map_list_of`之后,`MyObject*`才会变成`shared_ptr <MyObject>`s.为了保证异常安全,每个`new MyObject()`都需要替换为例如`boost :: make_shared <MyObject>()`. (5认同)