This answer is from https://stackoverflow.com/a/3279550/10133369 Overview Why do we need the copy-and-swap The copy-and-swap idiom is the solution, and elegantly assists the assignment operator in achieving two A successful solution As mentioned, the copy-and-swap idiom will fix all these issues. And that is the copy-and-swap idiom. What about C++11? And so concludes the copy-and-swap idiom. ---- Footnotes *Why do we set mArray to null?
问题 我发现 copy-and-swap 这个名词在很多地方都出现, What are your favorite C++ Coding Style idioms: Copy-swap Copy constructor 回答 为什么需要 copy-and-swap 呢? 任何资源管理类(比如智能指针)都需要遵循一个规则:三法则。 那 copy-and-swap 是怎么实现的呢?大致思路是:先用复制构造函数创建一个副本,然后利用函数swap交换其成员数据,当作用域退出,副本的析构函数会自动调用。 正确的做法 copy-and-swap 就可以同时解决上面的三个问题,做法是这样的, class dumb_array { public: // ... 而对于移动赋值(=),上面的 copy-and-swap 已经替我们做了,因为我们用的是值传递。 dumb_array& operator=(dumb_array other)
constSafeVector&other):pImpl(other.pImpl){}//移动构造函数SafeVector(SafeVector&&other)noexcept=default;//关键:copy-and-swap friendvoidswap(DesignGuidelines&,DesignGuidelines&)noexcept;//4.关键业务操作:提供强保证voidcriticalOperation(){//使用copy-and-swap 通过理解三种异常安全保证的区别,掌握copy-and-swap等惯用法,合理设计移动操作,并充分利用RAII模式,我们可以编写出既安全又高效的代码。
一个强大的技术是"Copy-and-Swap"惯用法。 善用"Copy-and-Swap":这是实现强保证函数的一个通用且有效的方法。正确使用noexcept:为移动操作、swap和析构函数标记noexcept。严守铁律:决不让异常从析构函数中逃逸。
std::endl; smart_ptr tmp(rhs); swap(rhs); return *this; } 实际上,我们比那个不需要多写代码move assignment,copy-and-swap
使用copy-and-swap。 来防止自我赋值风险的产生和提高赋值运算符函数的异常控制能力。 参考文献 《Effective C++ 第三版》
技巧包括比较 source(源)和 target objects(目标对象)的地址,关注语句顺序,和 copy-and-swap。 强力保证经常可以通过 copy-and-swap 被实现,但是强力保证并非对所有函数都可用。 一个函数通常能提供的保证不会强于他所调用的函数中最弱的保证。 30.
其实,还有一个更好的办法可以解决这个问题:copy-and-swap,不过不在这里作深入讨论,读者可以跟随链接具体了解。
其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。 ■ 确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。 ■ “强烈保证”往往能够以 copy-and-swap 实现出来,但“强烈保证”并非对所有函数都可实现或具备现实意义。
赋值运算符 赋值运算符 operator= 是一个经常被提及的运算符,需要修改左操作数,应该将其实现为成员函数,可参考 copy-and-swap。
强保证:结合 RAII 与 “拷贝 - 交换”(Copy-And-Swap)模式,先操作临时对象,再原子交换到目标对象。
string部分的模拟实现一样,不懂为什么这么写的可以我前面string模拟实现的文章 1.2.4 赋值的现代写法(拷贝交换技术) 这段代码中vector赋值运算符的现代写法基于拷贝交换技术(Copy-and-Swap 在这个 ** 拷贝交换技术(Copy-and-Swap)** 的赋值写法中,参数没有加const修饰的原因是: 这个参数是按值传递的副本(vector< T > tmp),函数内部需要通过swap操作修改这个副本的资源
其中技术包括“来源对象”和“目标对象”的地址、精心周到的语句顺序以及copy-and-swap 确定任何函数如果操作一个以上对象,而其中多个对象是同一个对象时,其行为仍然正确 12.
复制-交换(Copy-and-swap)惯用法 操作时先修改副本,再交换,保证强异常安全。 尽量避免在析构函数中抛异常 析构函数应保证不抛异常,否则可能导致程序终止。 3.
特别是异常发生时的回滚机制的正确使用,copy-and-swap是有效的方法。 3.注意需要异常保证的函数内部的调用函数,异常安全等级是以有最低等级异常保证的函数确定的。
“强烈保证”往往能够以copy-and-swap实现出来,但“强烈保证”并非对所有函数都可实现或具备现实意义。
_data, _capacity); } return *this; } 关键点:自我检测避免 a = a 导致释放自身内存后再访问;先释放再分配可以在内存受限时出错(可进一步改进为 copy-and-swap
.invoke(invocation); } } return invokers.get(0); Data - 支持事务回退,All-or-nothing m是数据表,cas指的是Copy-And-Swap
其中技术包括比较来源对象和目标对象的地址、精心周到的语句顺序、以及 copy-and-swap。 确保任何函数如果操作一个以上的对象,而其中多个对象是同个对象时,其行为忍然正常。