5

好的,所以我对复制和交换习语很感兴趣,我想我主要知道如何实现它。

但是,或者代码库使用MFC 的 CString 类作为字符串,这不会改变。

既然swap必须(应该???)不是抛出,我不能

std::swap(this->my_cstring, rhs.my_cstring);

因为这将创建一个可能抛出的临时 CString 对象。(加上它的低效。)

那我还剩下哪里?我应该添加一个try-catch吗?我真的应该允许这种(嗯,非常罕见的)内存不足的情况引发异常并使交换失败吗?

查看 CStrings 实现,似乎没有允许交换的成员或函数......

4

1 回答 1

3

自我回答:

在更仔细地研究 CString 之后,似乎由于 CString 是一个引用计数的字符串实现,通过 std::swap 交换它实际上是“99%”异常安全的,因为所发生的只是一些引用计数的增加和减少。

它只有“99%”的安全性,因为当 CString 对象时IsLocked,它总是会做一个副本。

于 2011-10-05T12:40:39.137 回答