Re: std::string as std::vector?
От: Demay  
Дата: 29.03.05 04:37
Оценка:
Здравствуйте, Mr. None, Вы писали:

MN>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Аноним, Вы писали:


А>>>Гарантируется ли стандартом размещение элементов строки в непрерывном блоке памяти, как это сделано для вектора? И имеет ли строка нуль терминатор равный *(string.end()). Спасибо

А>>Гарантируется если вызовешь c_str(), а в целом в большинстве реализаций STL не прерывный блок.

MN>Неверно. c_str() возвращает строку вида const char* заканчивающуюся 0, но никто не гарантирует, что эта строка будет ссылаться на корректное внутреннее представление. Иными словами c_str() может вернуть указатель на временный кеш, в котором будет собираться строка, а внутри она может храниться как угодно и если вы преобразуете значение, возвращаемое c_str() в char* и попытаетесь его изменить — это ни к чему не приведёт в лучшем случае, в худшем всё может упасть...


Меня всегда интересовал такой вопрос: если предположить что c_str() возвращает указатель на временный кеш, кто его должен освобождать и как. По логике освободить кэш должна вызывающая сторона, но как ?
Мне здесь видится некое лукавство стандарта, с одной стороны не гарантируется непрерывное размещение элементов строки, а с другой стороны c_str() должна возвращать указатель на непрерывный блок оканчивающийся 0.
Уважаемый ALL подскажите реализации STL использующие для строк различные несмежные блоки памяти, хотелось бы посмотреть устройство и логику работы string.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.