2011-10-05 68 views
4

好的,所以我都在copy-and-swap idiom上銷售,我想我主要知道如何實施它。如何交換MFC CString?

但是,或者代碼庫使用MFC's CString class作爲字符串,這是不會改變的。

由於swap必須的(應???)是拋出異常,我不能

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

因爲這將創建一個臨時的CString對象可能拋出。 (加上它效率低下。)

那麼我剩下的地方?我應該添加一個try-catch?我應該真的允許這種(很好,非常罕見)內存不足的情況發生異常並使交換失敗?

看着CStrings實現,它似乎並不有一個成員或功能,可用於交換...

+0

我看不到有理由對內存進行防禦編碼。在你的CString交換中處理它意味着它會彈出其他地方,對吧? –

+0

@Aidan:「處理它」是什麼意思。你不能以100%的異常保存方式交換'CString'。 –

+0

對不起,我的意思是,如果你的交換所遇到的唯一問題是內存不足,就不應該嘗試/捕獲,因爲內存不足會導致你在其他地方崩潰。 –

回答

2

自答:

尋找到CString的更緊密後,它將顯示,由於CString是引用的實際數字字符串實現,通過std :: swap交換它實際上是「99%」異常安全,因爲發生的所有事情都是一些引用計數增量和減量。

它只是「99%」的安全,因爲當CString對象IsLocked時,它會一直做一個副本。

+1

如果不是IsLocked *和* StringMgrs是相同的,那麼'CSimpleStringT :: CloneData(CStringData *)'只是增加引用計數。 –

+0

@丹尼爾 - 呃,我提到了IsLocked(反正它應該很少見)。我什至沒有檢查任何關於StringMgrs。 –