Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
1

можно ли сделать чтоб std::wstring не обнулял память при resize?

18.11.2020, 01:46. Показов 569. Ответов 7

Author24 — интернет-сервис помощи студентам
здравствуйте!

объявляю строку std::wstring, делаю ей resize, смотрю в отладчике - все символы равны нулю, то есть память обнулена. ладно, делаю resize на 50 символов, заполняю всё случайными символами, потом resize на 10 символов, потом resize на 40 символов - память после первых 10 символов обнулена. значит точно всегда обнуляет.

можно как-то принудительно сделать так, чтоб оно ничего не обнуляло - ни при resize в пределах capacity, ни при resize на больше чем capacity? у меня MS VS 2019, если важно...

спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2020, 01:46
Ответы с готовыми решениями:

Std::count << std::hex << (long) 0x0a; Как сделать, чтоб от HEX значения ноль при выводе не убирался?
сабж...( std::count &lt;&lt; std::hex &lt;&lt; (long) 0x0a; ) выводится просто a, вместо 0а, а надо чтоб...

Можно ли читать UTF8 в std::wstring потоком?
Интересует загрузка файла целиком.

Как правильно перевести std::wstring в std::string ?
Собственно как? :)

Непонятная ошибка при вызове std::vector::resize
Недавно заметил непонятную ошибку при вызове метода resize(); Я так и не понял как правильно...

7
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.11.2020, 05:31 2
Цитата Сообщение от WillyM Посмотреть сообщение
можно как-то принудительно сделать так, чтоб оно ничего не обнуляло - ни при resize в пределах capacity, ни при resize на больше чем capacity?
не можно.

то, что ты хочешь - противоречит здравому смыслу.
а так же, противоречит правилам языка (провоцирует UB)

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

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

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

таким образом, получается, что ты хочешь,
что бы std::wstring::resize создавал неинициализированные ячейки памяти,
обращение к которым будет приводить к неопределенному поведению.

так делать нельзя.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.11.2020, 06:12 3
Цитата Сообщение от hoggy Посмотреть сообщение
содержимое которых нужно проинициализровать конструктором,
что бы напротив, начать время жизни объектов.
Там же POD с тривиальным (ничего не делающим) конструктором. Инициализировать POD-ы - ненужная самодеятельность. Может, оно под буфер чтения ресайзится и все эти нули сейчас затрет. Хотя да, настройки для отключения самодеятельности не предусмотрели.
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
18.11.2020, 07:00  [ТС] 4
гм... да, но... я понимаю если бы речь шла об каких-то объектах. но у меня же там простой тип - wchar_t.
мне как раз и нужно чтобы память не инициализировалась лишний раз, мусор или не мусор в данном конкретном разрезе не имеет значения.

Добавлено через 26 минут
а... это и называется POD. буду знать, спасибо)
ну вот нужно мне условно буфер в допустим два гигабайта - зачем оно мне будет его лишний раз чистить, если я в него сразу после этого буду записывать или генерировать?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
18.11.2020, 08:12 5
WillyM,
1. про обнуление написано в документации, все эти эксперименты ставить было не обязательно.
2. ваша ситуация означает только лишь то, что std::(w)string для ваших нужд не подходит. Используйте другой инструмент и все.
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
18.11.2020, 09:03  [ТС] 6
но мне нужна строка. просто её содержимое появится во время работы программы.

можно ли тогда динамически выделить память под массив wchar_t и скормить в std::wstring так чтоб оно не копировало огромный массив, а "подключилось" к уже выделенной памяти?
сам массив в голом виде мне после этого будет уже не нужен.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
18.11.2020, 09:47 7
WillyM,
ну вот нужно мне условно буфер в допустим два гигабайта - зачем оно мне будет его лишний раз чистить, если я в него сразу после этого буду записывать или генерировать?
Мотивация ясна и понятна. Не вам одному такое надо. Но стандартные контейнеры всегда инициализируют память, с которой работают. Я в подобной ситуации просто использую контейнер pod_vector, который вынесен в библиотеку компании. Класс реализован на базе realloc. Помимо избавления от ненужной инициализации, дополнительно получаем возможно быстро перевыделять память с помощью realloc.

Вам нужно что-то подобное. Написать самому или найти готовое. Ключевое слово pod_vector хорошо гуглится.
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
18.11.2020, 09:50  [ТС] 8
что ж... жаль конечно что оно само по себе не умеет... ну да понятно с ним.
спасибо!
0
18.11.2020, 09:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2020, 09:50
Помогаю со студенческими работами здесь

Можно ли как-то скачать данные в память 1 раз при загрузке страницы, чтоб больше не обращаться к API
Доброго времени суток! Есть API отдающий информацию в JSON формате, которую надо распарсить и...

Как привести std::wstring к std::string?
Как привести std::wstring к std::string?

Преобразование из std::string - в std::wstring
Как попроще преобразовать string в широкую строку wstring? Так не получается: #include...

Std::string and std::wstring convert
случайно наткнулся на такую вот конвертацию std::string в std::wstring std::string text(&quot;text&quot;);...

Конвертация из std::string в std::wstring
В std::string находятся прочитанные данные из файла, в котором содержатся смешанные данные (что-то...

std::string -> std::wstring
Как перевести данный код в код с использованием wstring ( посути использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru