【发布时间】: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<int>也可以说明您的观点,并避免内存泄漏。 -
嗯,是的。
int是个坏例子,我应该用Image来做这件事。然后,我同意下面的jagansai,我应该使用shared_ptr。 -
不一定(资源不共享)
unique_ptr会很好(如果你有 C++0x) -
这将打破我示例的要点,我想在其中显示 强大的异常安全保证的 copy-work-swap-Idiom用
unique_ptr一个不能复制,只能移动。因此,如果LT-oepration 出现任何问题,强异常保证就会被打破。 -
正确...由于实现细节,资源是共享的。也许正确的解决方法是使用
std::vector<std::unique_ptr<Image>>来存储图像,并用std::vector<Image*>来补充它,这将用作索引,然后对索引进行排序,而不是对内容持有者进行排序。 (我不太喜欢shared_ptr,共享所有权通常表明设计有缺陷)。
标签: c++ exception-safe exception-safety