2011-10-05 3 views
4

OK, donc je suis tous vendu sur le copy-and-swap idiom et je pense que je sais surtout comment l'implémenter.Comment échanger un CString MFC?

Cependant, ou codebase utilise MFC's CString class comme chaîne et cela ne va pas changer.

Depuis swap doit (devrait ???) être nothrow, je ne peux pas faire

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

car cela créera un objet CString temporaire qui peut jeter. (Plus son inefficace.)

Alors où me reste-t-il? Dois-je ajouter un try-catch? Devrais-je permettre cette condition de mémoire (extrêmement rare) pour déclencher une exception et faire échouer l'échange?

Regarder la mise en œuvre de CStrings, il ne semble pas qu'il y ait un membre ou une fonction qui permet d'échanger ...

+0

Je ne vois pas de raison de coder défensivement pour mémoire insuffisante. Traiter de cela dans votre échange CString signifie simplement qu'il apparaîtra ailleurs, n'est-ce pas? –

+0

@Aidan: Qu'entendez-vous par "traiter avec". Vous ne pouvez simplement pas échanger un 'CString' d'une manière 100% exceptionnelle. –

+0

Désolé, je voulais dire, si la seule chose que votre tentative/catch autour du swap pourrait rencontrer est la mémoire insuffisante, il ne devrait pas y avoir d'essai/catch parce que la mémoire insuffisante ne fera que vous planter ailleurs de toute façon. –

Répondre

2

auto-réponse:

Après avoir examiné CString plus près, il semble qu'en raison de le fait que le CString est une implémentation de chaîne référence compté, en l'échangeant via std :: swap est en fait une exception de "99%", car tout ce qui arrive est une incrémentation et un décrément du nombre de références.

C'est seulement "99%" sûr, comme quand l'objet CString IsLocked, il fera toujours une copie.

+1

Si IsLocked * et * les StringMgrs ne sont pas identiques, alors CSimpleStringT :: CloneData (CStringData *) 'augmente simplement le nombre de références. –

+0

@Daniel - eah, j'ai mentionné IsLocked (qui devrait être rare de toute façon). Je n'ai même rien vérifié à propos de StringMgrs. –

Questions connexes