Re: [問題] operator=裡呼叫destructor

看板C_and_CPP作者 (fr3@K)時間11年前 (2014/11/26 15:53), 11年前編輯推噓2(2013)
留言15則, 6人參與, 最新討論串3/4 (看更多)
※ 引述《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. 反之只有一個 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.36.252 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416988399.A.517.html

11/26 16:58, , 1F
是freak!?!
11/26 16:58, 1F

11/26 17:25, , 2F
會公佈作業答案嗎?
11/26 17:25, 2F

11/26 17:34, , 3F
是我喔 (這樣好像怪怪的 @@)
11/26 17:34, 3F

11/26 17:37, , 4F
@dirkc: 或許沒有標準答案, 但樂意參與討論 :-)
11/26 17:37, 4F

11/26 17:40, , 5F
ctor的new那邊若"中途"失敗 已生成的記憶體會leak?
11/26 17:40, 5F

11/26 17:44, , 6F
ctor的寫法確實是not exception safety, 感謝大大發現
11/26 17:44, 6F

11/26 17:47, , 7F
提示 2: 的確只有一處的 exception 會造成影響
11/26 17:47, 7F

11/26 17:47, , 8F
但會造成兩個地方 leak
11/26 17:47, 8F

11/26 17:53, , 9F
er...這個專有名詞叫exception neutral吧....
11/26 17:53, 9F

11/26 17:55, , 10F
等等 不對 你這要求的確是exception safe沒錯
11/26 17:55, 10F

11/26 18:00, , 11F
提示 3: (其實是 correction, 之前沒注意到有 reserve Q_Q)
11/26 18:00, 11F

11/26 18:01, , 12F
沒有 reserve 才會有兩個地方 leak, 反之只有一個
11/26 18:01, 12F

11/26 18:02, , 13F
neutral是說exception得傳播到caller
11/26 18:02, 13F
※ 編輯: fr3ak (60.251.36.252), 11/26/2014 18:06:17

11/26 18:09, , 14F
幹 看不出來啦~~@_@ 難道要檢查self-assignment???
11/26 18:09, 14F

11/26 18:17, , 15F
原po已在另p 提供了一個解答. 還想動動腦袋的先不要看 XD
11/26 18:17, 15F
文章代碼(AID): #1KTORlKN (C_and_CPP)
文章代碼(AID): #1KTORlKN (C_and_CPP)