【问题标题】:How do I swap an MFC CString?如何交换 MFC CString?
【发布时间】:2011-12-01 10:29:25
【问题描述】:

好的,所以我对copy-and-swap idiom 很感兴趣,我想我主要知道如何实现它。

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

既然swap 必须(应该???)不能扔,我不能

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

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

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

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

【问题讨论】:

  • 我看不出有理由为内存不足进行防御性编码。在你的 CString 交换中处理它只是意味着它会在其他地方弹出,对吧?
  • @Aidan:“处理它”是什么意思。您根本无法以 100% 的异常保存方式交换 CString
  • 抱歉,我的意思是,如果您在交换时的 try/catch 可能遇到的唯一问题是内存不足,则不应有 try/catch,因为内存不足只会崩溃反正你在别处。

标签: visual-c++ mfc swap cstring copy-and-swap


【解决方案1】:

自我回答:

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

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

【讨论】:

  • 如果不是IsLocked 并且 StringMgrs 相同,那么CSimpleStringT::CloneData(CStringData *) 只会增加引用计数。
  • @Daniel - 嗯,我提到了 IsLocked(无论如何应该很少见)。我什至没有检查任何关于 StringMgrs 的信息。
猜你喜欢
  • 2014-08-23
  • 2011-09-07
  • 2010-11-02
  • 2019-10-19
  • 2011-04-12
  • 2020-06-27
  • 2013-10-09
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多