【问题标题】:Boost.Assign: using objects with map_list_of?Boost.Assign:使用带有 map_list_of 的对象?
【发布时间】:2011-09-23 16:09:16
【问题描述】:

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

如果没有,还有其他方法吗?

【问题讨论】:

    标签: c++ boost stdmap


    【解决方案1】:

    确实有效,是的;调用 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());
    

    【讨论】:

    • 这段代码仍然不是异常安全的; MyObject*s 直到 map_list_of 执行完毕后才会变成 shared_ptr&lt;MyObject&gt;s。为了异常安全,每个new MyObject() 都需要替换为例如boost::make_shared&lt;MyObject&gt;().
    • @ildjarn 如果 map_list_of 是一个单一的函数调用,那你绝对是对的;它实际上是一个仿函数对象。 map_list_of(1, new MyObject());是它的构造函数,并且是异常安全的;下面的每个 operator() 调用也是异常安全的。
    • @ildjarn 转念一想,你就在这里。 map_list_of 将推断其第二个模板参数为 MyObject*,如果在完成之前抛出异常,则会泄漏。我已经编辑了 map_list_of 的模板参数,所以它是异常安全的。
    • 说真的,只需致电 make_shared 即可。
    【解决方案2】:

    似乎是的。这与 VS2010 & boost 1.47 可以很好地编译。

    #include <boost\assign.hpp>
    class MyObject{
    public:
        MyObject(int i):m_i(i){}
    private:
        int m_i;
    };
    
    
    int main (void)
    {
        std::map<int, MyObject*> objects = boost::assign::map_list_of(1, new MyObject(1))(2, new MyObject(2))(3, new MyObject(3));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2021-01-14
      相关资源
      最近更新 更多