3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
|
|
1 | |
можно ли сделать чтоб std::wstring не обнулял память при resize?18.11.2020, 01:46. Показов 569. Ответов 7
здравствуйте!
объявляю строку std::wstring, делаю ей resize, смотрю в отладчике - все символы равны нулю, то есть память обнулена. ладно, делаю resize на 50 символов, заполняю всё случайными символами, потом resize на 10 символов, потом resize на 40 символов - память после первых 10 символов обнулена. значит точно всегда обнуляет. можно как-то принудительно сделать так, чтоб оно ничего не обнуляло - ни при resize в пределах capacity, ни при resize на больше чем capacity? у меня MS VS 2019, если важно... спасибо!
0
|
18.11.2020, 01:46 | |
Ответы с готовыми решениями:
7
Std::count << std::hex << (long) 0x0a; Как сделать, чтоб от HEX значения ноль при выводе не убирался? Можно ли читать UTF8 в std::wstring потоком? Как правильно перевести std::wstring в std::string ? Непонятная ошибка при вызове std::vector::resize |
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
18.11.2020, 05:31 | 2 |
не можно.
то, что ты хочешь - противоречит здравому смыслу. а так же, противоречит правилам языка (провоцирует UB) при ресайзе в меньшую сторону необходимо запустить деструкторы для тех ячеек памяти, которые должны стать недействительными. что бы прекратить время жизни живущих в них объектов. при ресайзе в большую сторону, становятся доступными ячейки памяти, содержимое которых нужно проинициализровать конструктором, что бы напротив, начать время жизни объектов. если этого не сделать, тогда ячейки будут хранить мусор. и в дальнейшем, при попытке доступа к объектам, время жизни которых не началось, мы получим неопределенное поведение. таким образом, получается, что ты хочешь, что бы std::wstring::resize создавал неинициализированные ячейки памяти, обращение к которым будет приводить к неопределенному поведению. так делать нельзя.
0
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
18.11.2020, 06:12 | 3 |
Там же 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 хорошо гуглится.
0
|
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
|
|
18.11.2020, 09:50 [ТС] | 8 |
что ж... жаль конечно что оно само по себе не умеет... ну да понятно с ним.
спасибо!
0
|
18.11.2020, 09:50 | |
18.11.2020, 09:50 | |
Помогаю со студенческими работами здесь
8
Можно ли как-то скачать данные в память 1 раз при загрузке страницы, чтоб больше не обращаться к API Как привести std::wstring к std::string? Преобразование из std::string - в std::wstring Std::string and std::wstring convert Конвертация из std::string в std::wstring std::string -> std::wstring Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |