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