|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|||||||||||
Беда с resize() для vector<uint8_t>19.02.2025, 14:33. Показов 3777. Ответов 20
В коде использую несколько векторов. В описании класса перечисляю указатели на них так:
По адресу __begin_ 0x20000248 будет лежат первый элемент вектора. Далее заполняю вектор, в памяти смотрю данные и всё там ОК: первый элемент лежит по адресу 0x20000248. Работаю с данными - всё замечательно. Затем мне снова надо сделать pNZR->resize(131), было 119 элементов, а хочу 131: По адресу __begin_ 0x00000000 как бы должен лежать первый элемент, но адрес не должОн быть таким. Далее в коде при заполнении вектора первый элемент по этому адресу, конечно, отсутствует и код, соответственно, шлёт меня подальше. ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО? P.S.: С другими векторами делаю подобное, но такого не происходит, resize() делается как положено. Делал также несколько раз - всё работает. Пробовал для pNZR делать перед вторым resize() вот так: pNZR->capacity(). Возвращалось значение 119.
0
|
|||||||||||
| 19.02.2025, 14:33 | |
|
Ответы с готовыми решениями:
20
Для чего в данном коде vector.resize() resize и vector Vector::resize |
|
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
|
|
| 19.02.2025, 14:53 | |
|
Вектор хранит все свои элементы в памяти непрерывно. Если при ресайзе места под новые элементы не хватает, он реаллоцирует их в другое место. Соответственно, надо обновить указатель на первый элемент при каждом ресайзе. Иначе могут происходить внезапные падения приложения, что у вас, похоже, и наблюдается. Другим решением проблемы, наверное, может служить резервирование под вектор максимально возможного (адекватного) числа элементов, если оно известно заранее, но такое решение попахивает костылем и генератором ошибок. Уж лучше тогда использовать обычный массив.
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||||
| 19.02.2025, 15:01 | ||||||
|
1. Не понятно зачем вы объявляете указатель на вектор, после чего вектор конструируете через new.
У меня есть лишь одно предположение: ранее вы работали с массивами через указатель, теперь решили использовать STL, но немного не разобрались в каком месте динамичность размера вектора возникает. В общем сделайте просто:
2
|
||||||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 19.02.2025, 15:01 [ТС] | ||
|
Вообще я знаю, что адрес первого элемента изменится после resize(), поэтому обращаюсь к нему через указатель на сам вектор. К элементам вектора так: pNZR->at(i); Если нужен указатель на первый элемент, то так: pNZR->data(); А как обновить указатель на первый элемент?
0
|
||
|
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
|
|
| 19.02.2025, 15:07 | |
|
Так указатель на вектор и не изменится. Не знаю пока, проблема скорее всего в pNZR->data(), но нужно смотреть сам код. Для начала возьмите первый элемент как pNZR->at(0) и подумайте, может объявление вектора через new действительно лишее.
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||
| 19.02.2025, 15:10 | ||||
|
2.
Зачем в Embeded работа с динамической памятью - вопрос несколько риторический, ну да ладно, например у нас программно конфигурируемая длина ленты. Так вот в микроконтроллере нулевой адрес в памяти данных - абсолютно валидный адрес. Собственно почему он должен быть невалидным? адреса начинаются с нуля. Просто так сложилось, что на привычной платформе x86 адреса вокруг нулевого (снизу памяти и "сверху") искусственно объявлены "недопустимыми". Хотя нулевой адрес ячейки памяти в микросхеме ничем не хуже любого другого адреса ячейки памяти. Не по теме: Долой дискриминацию нулевых адресов! Добавлено через 2 минуты Я по заголовку тоже подумал, что вы сохраняете адрес элементов вектора, но этого в коде нет, так что всё нормально. (ну за исключением того, что нет смысла создавать вектор через new)
0
|
||||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 19.02.2025, 15:14 [ТС] | ||
|
0
|
||
|
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
|
|
| 19.02.2025, 15:22 | |
|
Ну таки да, элемены формы обычно хранят в куче. А у вас - вектор с какими-то данными. Это я когда-то давно тоже такого "нахватался" и навыделял под каждый пиксель new QColor(). Потому что: "ну а чо, так же прикольнее!" И (поскольку за неправильное освобождение памяти никто мне по голове не стучал) потом с интересом наблюдал адовую утечку памяти после каждого обновления виджета
![]() К слову, недавно я действительно использовал указатель на контейнер. Так было надо, чтобы избавиться от кучи if. Но я брал его через ссылку, при этом четко понимал его время жизни и при работе с указателем не вносил в сам контейнер никаких изменений.
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|||
| 19.02.2025, 15:38 [ТС] | |||
|
Добавлено через 6 минут
0
|
|||
|
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
|
||||||
| 19.02.2025, 15:38 | ||||||
|
В подавляющем большинстве случаев -
foo(const vector<... > &v) Или без const, если хотите менять его в функции. Или объявить функцию как foo(vector<double> *v), объявлять и передавать в нее вектор, например, вот так:
Upd: Для случаев, когда заранее не известен размер массива, как раз и существует вектор. Идея, которую вы описали, больше подходит для более низкоуровневого управления памятью, через обычные динамические массивы, а вектор как раз позволил бы написать это все компактнее. Если вам позволяют пользоваться вектором - используйте его и объявляйте в стеке. Ладно, отпускай меня работать. А то на меня уже начальник криво косится
0
|
||||||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 19.02.2025, 15:40 [ТС] | ||
|
0
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||
| 19.02.2025, 15:50 | |||
|
Добавлено через 2 минуты Дополнительно занимать память под указатель на вектор плюс дополнительно занимать память менеджера кучи плюс вызов менеджера кучи для создания экземпляра вектора, а потом тоже самое для удаления через delete - чтобы что? Сплошной оверхед и по памяти, и по производительности, а смысл мне не ясен (в вашем случае) PS Зачем такая парадигма принята в QT - не ведаю, не сталкивался никогда.
0
|
|||
|
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
|
|
| 19.02.2025, 15:51 | |
|
Можно вообще не делать resize. Просто добавляйте элементы через push_back и на всякий случай прочитайте, что такое reserve
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 19.02.2025, 15:51 [ТС] | ||
|
0
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 19.02.2025, 15:52 | |
|
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||||
| 19.02.2025, 15:59 [ТС] | ||||
|
При вызове конструктора я уже знаю всё количество, прикажете в for крутить push back() для всех векторов? Добавлено через 2 минуты
0
|
||||
|
Заблокирован
|
|
| 19.02.2025, 16:02 | |
|
Мне не причудилось.
Это в функции столько параметров? А где код с самим ресайзом и использования после этого? Добавлено через 1 минуту Блин, это конструктор. Вопрос тот же.
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|
| 19.02.2025, 16:03 [ТС] | |
|
0
|
|
|
Заблокирован
|
||||||
| 19.02.2025, 16:08 | ||||||
|
Alexey9891, странно, что данные которые по умолчанию, инициализируются в конструкторе.
Это потенциально опасно. В лучшем случае будут повторения от конструктора к конструктору.
0
|
||||||
|
86 / 60 / 12
Регистрация: 06.06.2013
Сообщений: 216
|
|
| 19.02.2025, 16:08 | |
|
Ну, собственно, да, как говорять французы, пуркуа бы и не па. А как вы потом заполняете вектор, если не через for? Конкретно в случае с uint8_t оно без разницы, но вот если в будущем создадите вектор для хранения пачки тяжелых экземпляров классов, сделаете ему ресайз, а затем начнете заполнять, программа сначала создаст вектор нужной длины, заполнит его классами через конструкторы по умолчанию, и только потом начнет копировать в них заданные вами настройки. Гораздо выгоднее будет объявить вектор, затем зарезервировать через reserve объем памяти, соответствующий его будущему размеру, а потом заполнять его классами сразу с требуемыми настройками через push_back.
0
|
|
| 19.02.2025, 16:08 | |
|
Помогаю со студенческими работами здесь
20
STL::vector (метод resize) Непонятная ошибка при вызове std::vector::resize vector в структуре: возможно? Рандомный выбор элементов vector-а "Преобразование" из uint8_t в byte [] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|