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

楼主: kwpn (ITSST)   2014-11-26 18:06:39
※ 引述《fr3ak (fr3@K)》之铭言:
: ※ 引述《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));
: : }
: : }
感谢大大发现错误。
修正1:
reverse 应改成 reserve,
先前code直接在bbs上打的,一时手X。
修正2:
此constructor为non exception safe,
并且导致A& A::operator=(A rhs)也为non exception safe。
当第二次以后的new int发生exception会导致vec里的int* memory leak。
以目前的架构可以改成
A::A(const A &rhs)
: vec()
{
vec.reserve(rhs.vec.size());
try {
for (auto &val : rhs.vec)
{
vec.push_back(new int(*val));
}
} catch(...) {
clear_up();
throw;
}
}
其中clear_up()为清除vec。
虽然不知道为啥原po会宣告成std::vector<int*>而不是std::vector<int>,
但若硬是要用pointer,使用smart pointer(std::unique_ptr, std::shared_ptr)
可以省略掉A::A(const A &rhs)里面的try catch也能达到exception safe。
A& A::operator=(A rhs) copy and swap idiom为exception safe,
前提是copy constructor与move constructor皆为exception safe。
: : 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?
: 提示: 有两个地方在发生 exception 的时候会 leak.
作者: fr3ak (fr3@K)   2014-11-26 18:11:00
Exceeds expectation不过我假设 int* 代表的是 1. 某种动态 allocated resourceand 2. noexcept assignment所以不是很 care 为什么是 int*

Links booklink

Contact Us: admin [ a t ] ucptt.com