|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Как - то не очень давно встречал на просторах ютьюба видеоуроки по С++ и там лектор увеличивал длину массиву путем объявления нового массива уже с большим размером(при помощи new) и копировал значения из старового в новый, затем делал удалял старый массив из памяти. Но я вот подумал, а почему не сделать это при помощи "realloc" ? проще ведь сделать realloc и байтики то и прирастут. Почему идею никто не документирует ? Единственное объяснение, что приходит на ум , что realloc может уткнуться в занятые кем-то байты и отвалить NULL. ведь данные массива располагаются подряд. Верно ли я полагаю или полный бред, а объяснение в другом? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 21:05 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81, до C++20 malloc/realloc/etc не вписывались в объектную модель C++ ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 21:48 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
a guest, Пусть будет не c++, а c. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 21:52 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81а объяснение в другом? В другом. realoc это и есть malloc + memmove + free. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 22:08 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Не понимаю почему его нельзя использовать для увеличения длины массива? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 22:23 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 Dimitry Sibiryakov, Не понимаю почему его нельзя использовать для увеличения длины массива? Можно, используйте. Если получится без перемещения, то и копирование не понадобится, ЕМНИП. Но только для простых типов - без конструкторов/деструкторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 22:38 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Точнее можно и с конструкторами, но типы данных должны быть тривиальными. Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 22:42 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
В С++ для работы с массивами есть std::vector<> , он сам решает вопросы с выделением памяти, копированием и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 07:11 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
petrav Точнее можно и с конструкторами, но типы данных должны быть тривиальными. Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню. что вы называете не тревиальными типами ? вот это ? Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:04 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
[quot petrav#22178235] andron81 Если получится без перемещения, то и копирование не понадобится, ЕМНИП. Но только для простых типов - без конструкторов/деструкторов. допустим массив состоит из интовых чисел. мне надо его расширить. объясните , пожалуйста, что значит перемещение ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:06 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:09 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Dima T ошибка моя была , что я написал три буквы в первом посте: "C++" . товарищ ниже правильно исправил, что команды malloc/realloc это не концепция C++ Раз malloc/realloc значит тут речь о древнем Си . никаких ООП там не было ! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:13 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 ошибка моя была , что я написал три буквы в первом посте: "C++" . Ты там еще про new написал, а это тоже С++ ИМХО ты сам запутался: посмотрел ролик про С++ и пытаешься выяснять почему в С так не рекомендуется делать. Можно, если это С, выше это уже не раз сказали. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:25 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 объясните , пожалуйста, что значит перемещение ? выделение памяти, копирование, освобождение, возврат нового адреса ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:27 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81а объяснение в другом? В другом. realoc это и есть malloc + memmove + free. нет ли опасности в использовании realloc ? далее пофантазирую немного, например, могу предположить такую ситуацию : вот сделали "строку" длиной 1000000 символов (включая символ '\0') Код: plaintext 1.
допустим отработало успешно , но последний элемент скажем уперся в "чужие" чьи-то байты. а затем ещё пытаюсь realloc-ом резервировать 100 символов. и вот как поведет себя realloc ? он же вынужден зарезервировать сразу же после тех байт которые зарезервирвал malloc . что будет в этом случае ? выдаст NULL или что - то иначе ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:30 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Dima T, ну да-да. написал. но забудьте про плюсы. до них я ещё дойду, просто учу с азов. а так как зеленый и адекватно вопрос не всегда удается сформулирвать. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:34 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 допустим отработало успешно , но последний элемент скажем уперся в "чужие" чьи-то байты. а затем ещё пытаюсь realloc-ом резервировать 100 символов. и вот как поведет себя realloc ? он же вынужден зарезервировать сразу же после тех байт которые зарезервирвал malloc . что будет в этом случае ? выдаст NULL или что - то иначе ? Ну написали же неоднократно: выделит новые 1000100 байт, скопирует 1000000 туда и освободит исходные 1000000 байт. Вернет адрес блока в 1000100 байт. Выделяется только целый блок, он не может состоять из нескольких фрагментов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:38 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Dima T andron81 допустим отработало успешно , но последний элемент скажем уперся в "чужие" чьи-то байты. а затем ещё пытаюсь realloc-ом резервировать 100 символов. и вот как поведет себя realloc ? он же вынужден зарезервировать сразу же после тех байт которые зарезервирвал malloc . что будет в этом случае ? выдаст NULL или что - то иначе ? Ну написали же неоднократно: выделит новые 1000100 байт, скопирует 1000000 туда и освободит исходные 1000000 байт. Вернет адрес блока в 1000100 байт. Выделяется только целый блок, он не может состоять из нескольких фрагментов. ну да. тоже экспериментальным путем увидел это. теперь я понял о чем писал Сибиряков : realoc это и есть malloc + memmove + free. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 08:44 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 ну да. тоже экспериментальным путем увидел это. теперь я понял о чем писал Сибиряков : realoc это и есть malloc + memmove + free. Это если "на месте" не получилось увеличить блок памяти, тогда будет "memmove". Иначе не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:06 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 petrav Точнее можно и с конструкторами, но типы данных должны быть тривиальными. Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню. что вы называете не тревиальными типами ? вот это ? Код: plaintext 1. 2. 3. 4.
Зависит от семантики "str". Если есть функция "void destroy(result *)", которая вызывает "free(res.str);" то простое копирование может вызвать проблемы, но не в данном случае. Потому что тут "realloc()" забудет о старом массиве. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:10 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
a guest, хватит бредить! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:38 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov andron81а объяснение в другом? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:44 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
petrav andron81 Dimitry Sibiryakov, Не понимаю почему его нельзя использовать для увеличения длины массива? Но только для простых типов - без конструкторов/деструкторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:47 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 что вы называете не тревиальными типами ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:48 |
|
увеличение длины массивы по средствам realloc
|
|||
---|---|---|---|
#18+
andron81 ошибка моя была , что я написал три буквы в первом посте: "C++" . товарищ ниже правильно исправил, что команды malloc/realloc это не концепция C++ Раз malloc/realloc значит тут речь о древнем Си . никаких ООП там не было ! C++ is a general purpose programming language based on the C programming language as described in ISO/IEC 9899:1999 Programming languages — C(hereinafter referred to as the C standard). In addition to the facilities provided by C, C++ provides additional data types, classes, templates, exceptions, namespaces, operator overloading, function name overloading, references, free store management operators, and additionallibrary facilities ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:56 |
|
|
start [/forum/topic.php?fid=57&msg=39986938&tid=2017362]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 402ms |
0 / 0 |