Re: [问题] operator=里呼叫destructor

楼主: fr3ak (fr3@K)   2014-11-26 15:53:17
※ 引述《kwpn (ITSST)》之铭言:
: 除了copy assigment可以用copy and swap idiom,
: move assignment也可以用。
: A::A(const A &rhs)
: : vec()
: {
: vec.reverse(rhs.vec.size());
: for (auto &val : rhs.vec)
: {
: vec.push_back(new int(*val));
: }
: }
: A::A(A &&rhs) noexcept
: : vec(std::move(rhs.vec))
: {
: }
: A& A::operator=(A rhs)
: {
: swap(rhs);
: return *this;
: }
: void A::swap(A &rhs) noexcept
: {
: std::swap(vec, rhs.vec);
: }
小弟不太嫩, PTT 首 PO.
相对于其他支援 exception 的语言, C++ 要求 programmer 对 exception 更有 sense,
更敏感.
出个小作业给有兴趣的朋友一起玩玩: 怎么修改可以达成 exception safety?
提示: (Updated) 如果没有 reserve, 有两个地方在发生 exception 的时候会 leak. 反之只有一个
作者: notBeing (read and be read)   2014-11-26 16:58:00
是freak!?!
作者: dirkc (3781615)   2014-11-26 17:25:00
会公布作业答案吗?
楼主: fr3ak (fr3@K)   2014-11-26 17:34:00
是我喔 (这样好像怪怪的 @@)@dirkc: 或许没有标准答案, 但乐意参与讨论 :-)
作者: saladim (杀拉顶)   2014-11-26 17:40:00
ctor的new那边若"中途"失败 已生成的内存会leak?
作者: kwpn (ITSST)   2014-11-26 17:44:00
ctor的写法确实是not exception safety, 感谢大大发现
楼主: fr3ak (fr3@K)   2014-11-26 17:47:00
提示 2: 的确只有一处的 exception 会造成影响但会造成两个地方 leak
作者: Killercat (杀人猫™)   2014-11-26 17:53:00
er...这个专有名词叫exception neutral吧....等等 不对 你这要求的确是exception safe没错
楼主: fr3ak (fr3@K)   2014-11-26 18:00:00
提示 3: (其实是 correction, 之前没注意到有 reserve Q_Q)没有 reserve 才会有两个地方 leak, 反之只有一个
作者: saladim (杀拉顶)   2014-11-26 18:02:00
neutral是说exception得传播到caller干 看不出来啦~~@_@ 难道要检查self-assignment???
楼主: fr3ak (fr3@K)   2014-11-26 18:17:00
原po已在另p 提供了一个解答. 还想动动脑袋的先不要看 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com