5
votes

OK, so I'm all sold on the copy-and-swap idiom and I think I mostly know how to implement it.

However, or codebase uses MFC's CString class as string and this ain't gonna change.

Since swap must (should???) be nothrow, I cannot do

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

since that will create a temporary CString object which may throw. (Plus its inefficient.)

So where I'm left? Should I add a try-catch? Should I actually allow this (well, extremely rare) out of memory condition to raise an exception and make swap fail?

Looking at CStrings implementation, it doesn't seem there's a member or function that allows for swapping ...

1
I can't see a reason to code defensively for out-of-memory. Dealing with it in your CString swap just means it will pop up somewhere else, right?Aidan Ryan
@Aidan: What do you mean by "dealing with it". You simply cannot swap a CString in a 100% exception save manner.Martin Ba
Sorry, I meant, if the only thing your try/catch around the swap could encounter is out-of-memory, there should not be a try/catch because out-of-memory will just crash you elsewhere anyway.Aidan Ryan

1 Answers

3
votes

Self-Answer:

After looking into CString more closely, it appears that due to the fact the CString is a reference counted string implementation, swapping it via std::swap is actually "99%" exception safe because all that happens is some reference count increments and decrements.

It's only "99%" safe, as when the CString object IsLocked, it will always do a copy.