powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / увеличение длины массивы по средствам realloc
34 сообщений из 34, показаны все 2 страниц
увеличение длины массивы по средствам realloc
    #39986877
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как - то не очень давно встречал на просторах ютьюба видеоуроки по С++
и там лектор увеличивал длину массиву путем объявления нового массива уже с большим размером(при помощи new) и копировал значения из старового в новый, затем делал удалял старый массив из памяти.
Но я вот подумал, а почему не сделать это при помощи "realloc" ? проще ведь сделать realloc и байтики то и прирастут.
Почему идею никто не документирует ? Единственное объяснение, что приходит на ум , что realloc может уткнуться в занятые кем-то байты и отвалить NULL. ведь данные массива располагаются подряд.
Верно ли я полагаю или полный бред, а объяснение в другом?
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986886
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81, до C++20 malloc/realloc/etc не вписывались в объектную модель C++
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986888
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest,
Пусть будет не c++, а c.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986890
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81а объяснение в другом?

В другом. realoc это и есть malloc + memmove + free.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986891
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Не понимаю почему его нельзя использовать для увеличения длины массива?
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986893
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dimitry Sibiryakov,
Не понимаю почему его нельзя использовать для увеличения длины массива?

Можно, используйте. Если получится без перемещения, то и копирование не понадобится, ЕМНИП.

Но только для простых типов - без конструкторов/деструкторов.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986894
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее можно и с конструкторами, но типы данных должны быть тривиальными. Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986920
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С++ для работы с массивами есть std::vector<> , он сам решает вопросы с выделением памяти, копированием и т.д.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986927
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Точнее можно и с конструкторами, но типы данных должны быть тривиальными. Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню.


что вы называете не тревиальными типами ?
вот это ?
Код: plaintext
1.
2.
3.
4.
typedef struct {
    int status; 
    char * str;
} result;
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986928
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot petrav#22178235]
andron81
Если получится без перемещения, то и копирование не понадобится, ЕМНИП.
Но только для простых типов - без конструкторов/деструкторов.


допустим массив состоит из интовых чисел. мне надо его расширить. объясните , пожалуйста, что значит перемещение ?
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986929
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
что вы называете не тревиальными типами ?

POD-структуры
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986930
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
что вы называете не тревиальными типами ?

POD-структуры



ошибка моя была , что я написал три буквы в первом посте: "C++" .
товарищ ниже правильно исправил, что команды malloc/realloc это не концепция C++

Раз malloc/realloc значит тут речь о древнем Си . никаких ООП там не было !
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986932
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
ошибка моя была , что я написал три буквы в первом посте: "C++" .

Ты там еще про new написал, а это тоже С++

ИМХО ты сам запутался: посмотрел ролик про С++ и пытаешься выяснять почему в С так не рекомендуется делать. Можно, если это С, выше это уже не раз сказали.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986933
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
объясните , пожалуйста, что значит перемещение ?

выделение памяти, копирование, освобождение, возврат нового адреса
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986934
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

andron81а объяснение в другом?

В другом. realoc это и есть malloc + memmove + free.


нет ли опасности в использовании realloc ?
далее пофантазирую немного, например, могу предположить такую ситуацию :

вот сделали "строку" длиной 1000000 символов (включая символ '\0')
Код: plaintext
1.
str = (char*)malloc(sizeof(char) *1000000); 



допустим отработало успешно , но последний элемент скажем уперся в "чужие" чьи-то байты.
а затем ещё пытаюсь realloc-ом резервировать 100 символов. и вот как поведет себя realloc ? он же вынужден зарезервировать сразу же после тех байт которые зарезервирвал malloc . что будет в этом случае ? выдаст NULL или что - то иначе ?
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986936
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ну да-да. написал. но забудьте про плюсы. до них я ещё дойду, просто учу с азов. а так как зеленый и адекватно вопрос не всегда удается сформулирвать.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986937
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
допустим отработало успешно , но последний элемент скажем уперся в "чужие" чьи-то байты.
а затем ещё пытаюсь realloc-ом резервировать 100 символов. и вот как поведет себя realloc ? он же вынужден зарезервировать сразу же после тех байт которые зарезервирвал malloc . что будет в этом случае ? выдаст NULL или что - то иначе ?

Ну написали же неоднократно: выделит новые 1000100 байт, скопирует 1000000 туда и освободит исходные 1000000 байт. Вернет адрес блока в 1000100 байт.

Выделяется только целый блок, он не может состоять из нескольких фрагментов.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986938
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
допустим отработало успешно , но последний элемент скажем уперся в "чужие" чьи-то байты.
а затем ещё пытаюсь realloc-ом резервировать 100 символов. и вот как поведет себя realloc ? он же вынужден зарезервировать сразу же после тех байт которые зарезервирвал malloc . что будет в этом случае ? выдаст NULL или что - то иначе ?

Ну написали же неоднократно: выделит новые 1000100 байт, скопирует 1000000 туда и освободит исходные 1000000 байт. Вернет адрес блока в 1000100 байт.

Выделяется только целый блок, он не может состоять из нескольких фрагментов.


ну да. тоже экспериментальным путем увидел это. теперь я понял о чем писал Сибиряков :
realoc это и есть malloc + memmove + free.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986961
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81

ну да. тоже экспериментальным путем увидел это. теперь я понял о чем писал Сибиряков :
realoc это и есть malloc + memmove + free.

Это если "на месте" не получилось увеличить блок памяти, тогда будет "memmove". Иначе не будет.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986964
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav
Точнее можно и с конструкторами, но типы данных должны быть тривиальными. Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню.


что вы называете не тревиальными типами ?
вот это ?
Код: plaintext
1.
2.
3.
4.
typedef struct {
    int status; 
    char * str;
} result;


Зависит от семантики "str". Если есть функция "void destroy(result *)", которая вызывает "free(res.str);" то простое копирование может вызвать проблемы, но не в данном случае. Потому что тут "realloc()" забудет о старом массиве.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986974
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest, хватит бредить!
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986980
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
andron81а объяснение в другом?
В другом. realoc это и есть malloc + memmove + free.Это справедливо для случая, когда не удаётся увеличить существующий блок памяти до нужного размера. Если же увеличение переданного по указателю блока памяти доступно, realloc только увеличивает блок памяти и возвращает тот же указатель, что ему передали.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986983
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
andron81
Dimitry Sibiryakov,
Не понимаю почему его нельзя использовать для увеличения длины массива?
Можно, используйте. Если получится без перемещения, то и копирование не понадобится, ЕМНИП.
Но только для простых типов - без конструкторов/деструкторов.
При использовании placement new можно и для непростых типов.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986984
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
что вы называете не тревиальными типами ?
То, что таковыми называется в стандарте.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39986986
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
ошибка моя была , что я написал три буквы в первом посте: "C++" .
товарищ ниже правильно исправил, что команды malloc/realloc это не концепция C++

Раз malloc/realloc значит тут речь о древнем Си . никаких ООП там не было !
Их в C++ никто не отменял. Сидят себе, родимые, под namespace std - std::malloc/std::realloc/std::free. Да и не может быть иначе, потому как:

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
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39987054
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЕсли же увеличение переданного по указателю блока памяти доступно

А когда оно может быть доступно?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include <stdio.h>
#include <stdlib.h>

int main()
{
   void* x = malloc(1000);
   void* y = realloc(x, 2000);
   printf("x = %p, y = %p\n", x, y);
}


Код: plaintext
x = 0000000000541400, y = 00000000005456F0

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39987058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А когда оно может быть доступно?

Код: plaintext
1.
2.
3.
	void* x = malloc(1025);
	void* y = realloc(x, 1027);
	printf("x = %p, y = %p\n", x, y);


Код: plaintext
x = 000000000045CA00, y = 000000000045CA00
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39987059
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39987071
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А когда оно может быть доступно?
Это как повезёт. Если первое выделение пришлось на начало страницы памяти и что-либо не "дефрагментировало" непрерывный свободный участок, есть вероятность, что повезёт. :)
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39987337
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

тему можно закрыть
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39987521
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
Точнее можно и с конструкторами, но типы данных должны быть тривиальными.
Не обязательно, достаточно чтобы типы были implicit-lifetime.
petrav
Ну и придётся руками конструкторы вызывать для новых объектов. Placement new какой-нибудь... точно не помню.
Не обязательно, объекты implicit-lifetime типов создаются неявно.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39988049
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
rdb_dev,
тему можно закрыть
Это не ко мне.
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39988147
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
andron81
rdb_dev,
тему можно закрыть
Это не ко мне.


да, понимаю. это к мейтону или к сове ))
...
Рейтинг: 0 / 0
увеличение длины массивы по средствам realloc
    #39989170
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно конешно. Ну ладно.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / увеличение длины массивы по средствам realloc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]