2011-10-05 5 views
4

OK, 그래서 나는 모두 copy-and-swap idiom에 팔렸고, 나는 그것을 구현하는 방법을 대부분 알고 있다고 생각합니다.MFC CString을 바꾸려면 어떻게해야합니까?

그러나 코드베이스는 MFC's CString class을 문자열로 사용하며 변경되지 않습니다.

swap해야하기 때문에 그 던질 수 임시 CString을 객체를 생성하기 때문에 내가

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

하지 수 nothrow 수 (???한다). (더하기 비효율적입니다.)

그래서 내가 남았습니다. try-catch를 추가해야합니까? 예외를 발생시키고 스왑을 실패하게하려면이 (잘, 극히 드문) 메모리 상태를 실제로 허용해야합니까? CStrings 구현 보면, 교환을 허용하는 회원이나 기능이있어 보이지 않는다

...

+0

메모리 부족을 방어 적으로 코딩 할 이유가 없습니다. 귀하의 CString 스왑에서 그것을 다루는 것만으로 다른 곳에서 팝업 될 것입니다. –

+0

@ 에이 든 : "그것을 다루는 것"이란 무엇을 의미합니까? 'CString'을 100 % 예외 저장 방식으로 바꿀 수는 없습니다. –

+0

죄송 합니다만, 스왑 주변에서 시도하거나 catch 할 수있는 유일한 것이 메모리 부족 인 경우, 메모리 부족으로 인해 어쨌든 다른 곳에서 충돌이 발생하므로 try/catch가 없어야합니다. –

답변

2

자기 답 :

더 밀접하게 CString을에보고 한 후, 나타나는 인해 그 사실 CString은 참조가 문자열 구현으로 계산됩니다. std :: swap을 통해이를 바꿔 넣는 것은 실제로 "99 %"예외 안전입니다. 왜냐하면 모든 일은 참조 카운트 증가 및 감소이기 때문입니다.

CString 개체 IsLocked은 항상 "99 %"안전하므로 CString 개체 인 경우 항상 복사본을 만듭니다.

+1

IsLocked *가 아니고 * StringMgrs가 같으면 'CSimpleStringT :: CloneData (CStringData *)'는 단순히 참조 횟수를 늘립니다. –

+0

@Daniel - eah, 나는 IsLocked를 언급했다 (어쨌든 희소해야 함). 나는 StringMgrs에 대해서 아무 것도 검사하지 않았다. –

관련 문제