Может ли std :: string перемещаться после создания, если он никогда не изменялся?

0

Я использую std :: string для управления памятью и эффективности для хранения относительных данных местоположения.

Строка std :: инициализируется длиной 30 байт, и после этого никогда не будет никаких вызовов, сделанных в их контейнере, кроме, возможно, деструктора.

То, что я хочу знать, - это если им гарантировано остаться в одном месте после того, как они были инициализированы, если они не будут изменены?

  • 0
    Смотрите здесь : «Указатель, полученный из c_str (), может быть признан недействительным путем: передачи неконстантной ссылки на строку в любую стандартную библиотечную функцию или вызова неконстантных функций-членов в строке (...)»
  • 0
    Я передал непостоянную ссылку на символ * для инициализации, но он должен просто скопировать эти данные и все будет хорошо, я полагаю, после этого.
Показать ещё 4 комментария
Теги:
c++11

3 ответа

2
Лучший ответ

Если вы перемещаете, вы имеете в виду, что внутренний указатель на строку символов может быть изменен, а затем нет, это не должно происходить до тех пор, пока вы не вызываете какие-либо неконстантные строковые методы.

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

  • 0
    STD :: строка (данные, 30); где данные - char *, 30 - size_t. После этого любой доступ на чтение должен осуществляться непосредственно из внутреннего указателя. Вот как происходит создание и доступ.
1

Если вы каким-либо образом не измените строку, адрес ее динамических данных не изменится. Я настоятельно рекомендую вам использовать const std::string в том случае, если вы описываете это для лучшей удобочитаемости и ремонтопригодности.

0

Это звучит так, как если бы вы захотели использовать std::unique_ptr<char[]> вместо std::string. Это делает тот факт, что вы на самом деле не храните строку, но хотите только автоматического уничтожения, явного.

  • 0
    В этом случае автоматическое уничтожение не требуется, объекты создаются динамически и будут явно уничтожены кодом. Спасибо хоть
  • 0
    @Nowayz Тогда, боюсь, я не совсем понимаю, что ты пытаешься сделать ...
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню