【问题标题】:Exception Safety example guarantee correct?异常安全示例保证正确吗?
【发布时间】:2011-08-07 12:30:52
【问题描述】:

我讨论了异常安全保证,并设计了一个我认为提供强保证的示例:

template<typename E, typename LT>
void strongSort(vector<E*> &data, LT lt) // works on pointers
{
  vector<E*> temp { data };  // bad_alloc? but 'data' not changed. 
  sort(temp.begin(), temp.end(), lt); // 'lt' might throw!
  swap(temp, data); // considered safe.
}

只是一个简单的 (C++0x) 示例:如何使用它:

int main() {
  vector<int*> data { new int(3), new int(7), new int(2), new int(5) };
  strongSort( data, [](int *a, int *b){ return *a<*b;} );
  for(auto e : data) cout << *e << " ";
}

假设LT 不会改变元素,但它可能会抛出。假设代码提供的内容是否正确

  • 强大的异常安全保证
  • 异常中性,w.r.t to LT

【问题讨论】:

  • 我会放弃在向量中使用指针,它们会让事情变得尴尬而没有真正的好处。 std::vector&lt;int&gt; 也可以说明您的观点,并避免内存泄漏。
  • 嗯,是的。 int 是个坏例子,我应该用 Image 来做这件事。然后,我同意下面的jagansai,我应该使用shared_ptr
  • 不一定(资源不共享)unique_ptr 会很好(如果你有 C++0x)
  • 这将打破我示例的要点,我想在其中显示 强大的异常安全保证copy-work-swap-Idiom用unique_ptr一个不能复制,只能移动。因此,如果LT-oepration 出现任何问题,强异常保证就会被打破。
  • 正确...由于实现细节,资源是共享的。也许正确的解决方法是使用std::vector&lt;std::unique_ptr&lt;Image&gt;&gt; 来存储图像,并用std::vector&lt;Image*&gt; 来补充它,这将用作索引,然后对索引进行排序,而不是对内容持有者进行排序。 (我不太喜欢shared_ptr,共享所有权通常表明设计有缺陷)。

标签: c++ exception-safe exception-safety


【解决方案1】:

是的。强异常保证意味着操作成功完成或保持数据不变。

异常中性意味着您让异常传播。

【讨论】:

    【解决方案2】:

    这是异常安全的。为了更安全,为什么不使用vector&lt;shared_ptr&lt;int&gt;&gt;

    template<typename Type, typename Func>
    void StrongSort( vector<shared_ptr<Type>>& elems, Func fun)
    {
        vector<shared_ptr<Type>> temp ( elems.begin(), elems.end());
        sort(temp.begin(), temp.end(), fun);
        swap(elems, temp);
    }
    
    vector<shared_ptr<int>> ints;
    ints.push_back(shared_ptr<int>(new int(3)));
    ints.push_back(shared_ptr<int>(new int(1)));
    ints.push_back(shared_ptr<int>(new int(2)));
    StrongSort(ints, [](shared_ptr<int> x, shared_ptr<int> y) -> bool { return *x < *y; });
    

    【讨论】:

    • 两个原因:a) 在我的教程中,我当时还没有提到 shared_ptr。 b) shared_ptr 带来更多的运行时开销。这里没有真正的“共享语义”,所以不需要shared_ptr。但是你可以说服我使用unique_ptr——它们应该是免费的,但可能会使示例变得无用,因为我无法复制它们的向量;-)
    • 是的。 shared_ptr 带有开销。我只是想说,如果您使用对象代替原始类型,使用“shared_ptrs 向量”而不是指针向量更安全。
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多