class int_array {
int* array;
int size;
public:
int_array& operator=(int_array const& rhs)
{
if (this == &rhs) {
return *this;
}
delete[] array;
array = new int[];
std::copy(rhs.array, rhs.array + rhs.size, array);
size = rhs.size;
return *this;
}
/* other members */
};
设想在下面这样的上下文中
int_array a /* init */;
int_array b;
try {
b = a;
} catch (std::bad_alloc) {
}
/* ''b'' is bad now! */
operator=
之后, 先执行了 delete[]
, 这一句没问题, 如果之后的array = new int[];
内存分配失败, 这时
b
的成员 array
已经崩坏掉了, 以后再继续使用 b
显然是一件很糟糕的事情.为了保持对象状态一致性, 很自然地应该将对象状态的切换放入一个尽可能安全的环境中. 一个方法是使用先复制一份对象, 然后利用绝对安全的
std::swap
将副本与当前对象交换. 假如在复制过程中出错, 并不会破坏当前对象的状态一致性.class int_array {
public:
int_array& operator=(int_array const& rhs)
{
if (this == &rhs) {
return *this;
}
int_array copy(rhs);
swap(copy);
return *this;
}
void swap(int_array& other)
{
std::swap(array, other.array);
std::swap(size, other.size);
}
/* other members */
};
mv
到配置文件.