![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Слышу что плохо , а в чем ?, ну есть вектор, ну он же не вместо realloc, по крайне мере в доках никто не говорит что он лучше,
Или Я чего не понимаю? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
1) Как минимум realloc не типизирован (читай увеличивается вероятность ошибки). 2) Вместе с указателем на память, выделенную malloc/realloc неплохо бы хранить выделенный размер. У вектора это есть нахаляву 3) При удалении вектора он сам следит за освобождением выделенной им памяти, в случае с malloc/realloc программист должен не забыть вызвать free когда память больше не нужна на самом деле пунктов больше... я тебе только основные привёл -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
самый главный забыл.
если у тебя объекты содержат ссылки/указатели на другие объекты в том же массиве, то после realloc возможна ситуация, что размещение массива в памяти изменится, а вот указатели/ссылки внутри объектов нет. В итоге это приведет к серьезным ошибкам. Именно поэтому в С++ realloc нежелателен. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
как это измениться ? man 3 realloc void *realloc(void *ptr, size_t size); realloc() changes the size of the memory block pointed to by ptr to size bytes. The contents will be unchanged to the minimum of the old and new sizes; newly allocated memory will be uninitialized. If ptr is NULL, then the call is equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not NULL, then the call is equivalent to free(ptr). Unless ptr is NULL, it must have been returned by an earlier call to malloc(), calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done. где тут сказано про то что размешение измениться ,? borisbn для стандартных задач это хорошо, ну а если свой вектор нужен , самое простое перед функцией resize - запись в лог, или мютекс ,? и есть типы обьестов которые надо закрыть ? то наследовать? обертку писать ? ну тогда твой класс должен быть темплайтным , У меня свой контейнер , и Я счас не знаю что лучше realloc или новый malloc + memcpy + заполнение второй части данными, Я с этим столькнулся в 99 году на чистом С(Win32), realloc из-за падал и пришлось менять логику что-бы без него , там что то обьяснялось ,только Я не помню С тех пор наверно что-то изменилось ? |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
sergioK1, Как вы себе вообще это представляете? Произвольное изменение размера, непрерывного участка памяти ?
realloc |
|||
|
||||
| sergioK1 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Xm почему в доке Линукса ничего про это не сказано ? хотя простой тест показал что это так, чего то Я не понимаю, блок памяти передвиниться а ссылки эти разве не в нем? , т,е элемент массива это стуктура , где первый элемент это его начало , и все ссылки внутри что с ними будет ? если скажем первый элемент массива имеет ссылку на скажем 8-ой тогда да realloc даст сбой , но в каком случае, изначально создавать такой массив архитектурная ошибка IMHO, или задача специфичная, и потом элементы могут меняться , кто за ссылками следить будет ? да и какая разница С или С++? |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
>обертку писать ? ну тогда твой класс должен быть темплайтным
Абсолютно ничего плохого здесь не вижу. >да и какая разница С или С++? тут 2 момента: 1) ты задал вопрос именно про Си++ 2) в Си просто нет вектора, new/delete и т.п., поэтому в Си кроме realloc'а ничего и не остаётся. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
в С++ есть только new и delete.
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| LeonidPr |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Здесь
--------------------
pkunzip.zip |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Вообще-то вектор копирует содержимое не с помощью memcpy, а с использованием операторов копирования. Поэтому, если класс более или менее вменяемый, то он это дело сам разрулит. |
|||
|
||||
| sergioK1 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Да нет, Я говорю не про вектор , это отдельная тема , Случайно ++ добавил , Я про realloc vs новый malloc c переписыванием всего старого массива в новый , т,е, способ 1
или
вместо int* могут быть обьекты AnyClass* object , разница тоько что в С++ typedef не нужен и в С есть только Struct. т,е, чем плохо Я имел ввиду разницу между этими способами, какая разница С или С++? bsa : какая разница что оператор копирования ,это тот же memcopy, только скрыиый, релизации на все равно на асемблере , другово еще не придумали Это сообщение отредактировал(а) sergioK1 - 7.3.2012, 14:53 |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Оператор копирования - это operator =() и копируемый класс его может переопределить, если это надо (а это часто надо) Как все запущено |
|||
|
||||
| sergioK1 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Это как бы все знают , И что , это всего лишь для удобсва , легче писать , А как он реализован? И чем скомилированный код с ним отличаеться от того что без ? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Отличаться может координально. Вплоть до того, что memcpy работать для данного класса не будет, а operator =() будет. Например:
Без operator=() этот класс после копирования начнет дописывать строки к оригиналу (откуда копировали), а не к себе. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |