Как поменять местами MFC CString?

Хорошо, так что я все придерживаюсь идиомы копирования и обмена и я думаю, что в основном знаю, как это реализовать.

Однако или база кода использует класс CString MFC как строку, и это не так. не собираюсь измениться.

Так как swap не должен (должен ???) быть ничем, я не могу делать

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

так как это создаст временный объект CString, который может вызывать. (Плюс это неэффективно.)

Так где я остаюсь? Стоит ли добавить пробную ловушку? Должен ли я действительно позволять этому (ну, крайне редко) состоянию нехватки памяти вызывать исключение и приводить к сбою подкачки?

Глядя на реализацию CStrings, не похоже, что есть член или функция, позволяющая менять местами ...


person Martin Ba    schedule 05.10.2011    source источник
comment
Я не вижу причин защищаться от недостатка памяти. Работа с ним в вашем свопе CString просто означает, что он появится где-то еще, верно?   -  person Aidan Ryan    schedule 05.10.2011
comment
@Aidan: Что ты имеешь в виду под этим. Вы просто не можете поменять местами CString способом 100% сохранения исключений.   -  person Martin Ba    schedule 05.10.2011
comment
Извините, я имел в виду, что если единственное, с чем может столкнуться ваш try / catch вокруг свопа, - это нехватка памяти, не должно быть try / catch, потому что нехватка памяти в любом случае просто приведет к сбою в другом месте.   -  person Aidan Ryan    schedule 05.10.2011


Ответы (1)


Самостоятельный ответ:

При более внимательном рассмотрении CString выяснилось, что из-за того, что CString является строковой реализацией с подсчетом ссылок, замена его с помощью std :: swap на самом деле безопасна на "99%" исключений, потому что все, что происходит, некоторые приращения и убывания счетчика ссылок.

Это безопасно только на "99%", поскольку, когда объект CString IsLocked, он всегда будет копировать.

person Martin Ba    schedule 05.10.2011
comment
Если не IsLocked и, StringMgrs одинаковы, тогда CSimpleStringT::CloneData(CStringData *) просто увеличивает счетчик ссылок. - person Daniel Trebbien; 05.10.2011
comment
@Daniel - ага, я упомянул IsLocked (что в любом случае должно быть редкостью). Про StringMgrs я даже ничего не проверял. - person Martin Ba; 05.10.2011