Mar*_* Ba 5 mfc swap cstring visual-c++ copy-and-swap
好的,所以我完全接受了复制和交换习语,我想我主要知道如何实现它。
但是,或者代码库使用MFC 的 CString 类作为字符串,这不会改变。
既然swap必须(应该???)不抛出,我不能做
std::swap(this->my_cstring, rhs.my_cstring);
Run Code Online (Sandbox Code Playgroud)
因为这将创建一个可能抛出的临时 CString 对象。(加上它的低效。)
那么我还剩下什么?我应该添加一个try-catch吗?我真的应该允许这种(好吧,非常罕见)内存不足的情况引发异常并使交换失败?
查看 CStrings 实现,似乎没有允许交换的成员或函数......
自我回答:
更仔细地研究 CString 后,看来由于 CString 是引用计数字符串实现,因此通过 std::swap 交换它实际上是“99%”异常安全,因为所发生的只是一些引用计数递增和递减。
它只有“99%”安全,因为当 CString 对象时IsLocked,它总是会进行复制。