![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
Решил поэкспериментировать с динамической памятью. В общем память, выделенная с помощью malloc() - должна освобождаться функцией free(). А new - с помощью delete <объект/тип> или delete []<объект/тип>. Хочу изменить в методе Add() класса MyArray размер динамической памяти с помощью старой функции realloc() языка С - нормально.
Вопрос такой: а хорошо/плохо то, что в деструкторе не free(), а delete [] при том, что в одном из методов используется realloc?
Это сообщение отредактировал(а) Voldemar2004 - 13.11.2006, 15:35 -------------------- i_i (';') (V) ![]() |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Майерс точнобы заплакал
-------------------- <удалено администрацией форума> |
|||
|
||||
| AlexST |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 30.4.2006 Где: Москва Репутация: нет Всего: 3 |
Канешь очень плохо. По стандарту: " Результат вызова delete для указателя, который не был получен из new, не определен".
|
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
Так я и использую new и delete соответственно. Просто в методе Add() расширение памяти делается с помощью realloc().
-------------------- i_i (';') (V) ![]() |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Нет. По идее realloc использовать тоже нельзя.
По причине, что указал AlexST. Лучше взять и перевыделить... Если громоздко - завернуть в отдельную функцию... |
|||
|
||||
| AlexST |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 30.4.2006 Где: Москва Репутация: нет Всего: 3 |
Voldemar2004, calloc, malloc, free, realloc реализованы на одном алгоритме. new/delete - это другое.
Это сообщение отредактировал(а) AlexST - 14.11.2006, 19:02 |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Voldemar2004, полагаю плохо и вот почему: To new is C++; To malloc is C; To mix them is sin -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
Rockie, я тоже читал недавно эту страницу.
-------------------- i_i (';') (V) ![]() |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Зачем через вектор? Можно просто создать массив большей длинны чем нынешний, копируешь туда значения из маленького, удаляешь маленький массив и создаешь его заново увеличив размер, затем переносишь из вспомогательного массива данные в свой заново роженный и удаляешь вспомогательный.
-------------------- <удалено администрацией форума> |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 8 Всего: 158 |
EvgenZ, эм. а вспомогательный то зачем вообще?
|
|||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: 1 Всего: 16 |
Ну кстати на системном уровне пара new/delete аналогична malloc/free, просто появилась чуть позже, уже в С++, а вот что она там по стандартам возвращает я не в курсе.
|
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
А как? Как создать массив большего размера из массива не используя вспомогательного с сохранением данных?
-------------------- <удалено администрацией форума> |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Заранее выделять хотя бы в 2 раза больше, чем надо... в особых критичных случаях...
Как это, например, делает большинство STL- контейнеров. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Daevaorn, ну пускай будет 1.5... Суть остается неизменной...
|
|||
|
||||
| AlexST |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 30.4.2006 Где: Москва Репутация: нет Всего: 3 |
Я уже не говорю о том, что free не подчистит хорошо за new, а delete за malloc (и т. п.) напороть может. Это сообщение отредактировал(а) AlexST - 15.11.2006, 19:37 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: 1 Всего: 16 |
Я же сказал на системном уровне. И та, и другая пара использует HeapAlloc/HeapFree, а насчёт введения дополнительных проверок и того, что она возаращет я уже кажется сказал. |
|||
|
||||
| AlexST |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 331 Регистрация: 30.4.2006 Где: Москва Репутация: нет Всего: 3 |
||||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Если честно, так и не понял зачем выделять лишний массив. Создать новый требуемой размерности, скопировать туда элементы из изначального, поменять местами указатели и убить старый массив.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Voldemar2004 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1650 Регистрация: 25.12.2004 Репутация: нет Всего: 23 |
М-да. Я так и не нашел нигде как обойти malloc и сделать все через new, у Страуструпа тоже нет. Добавлено @ 23:06 Попробовал свой вышеописанный код - все нормуль, вроде бы. -------------------- i_i (';') (V) ![]() |
|||
|
||||
| EvgenZ |
|
||||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
кривовато, но смысл отображает, я это имел ввиду. Добавлено @ 00:32
эквиваленты malloc & free -------------------- <удалено администрацией форума> |
||||
|
|||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
вот попробовал, покритикуйте пожалуйста.
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Добавлено @ 10:21
а это как, если ты пишешь, что новый у тебя на 10 больше старого? Это сообщение отредактировал(а) EvgenZ - 16.11.2006, 17:04 -------------------- <удалено администрацией форума> |
|||
|
||||
| Kostt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 169 Регистрация: 8.1.2006 Где: Томск Репутация: 1 Всего: 3 |
Интуиция подсказывает, что лучше не 1.5, а золотое сечение
|
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Что такое золотое сечение?
-------------------- <удалено администрацией форума> |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
EvgenZ, приблизительно 1.61...
Добавлено @ 14:26 Если точнее, то ( "корень из 5" -1 ) / 2 |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 8 Всего: 158 |
||||
|
||||
| Rockie |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
программу запускал?
на случай если вместо
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||||||
|
|||||||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
Вот сейчас запустил... извиняюсь
вот это мне не понятно, откуда новый берется? И собственно почему вообще работает т.е. это получается, что создается временный changed_array который присваивается в main size'у и потом удаляется? Почему тогда size куда-то указывает? Почему не ругается на return size = сhanged_array; ? Это сообщение отредактировал(а) EvgenZ - 16.11.2006, 18:03 -------------------- <удалено администрацией форума> |
|||
|
||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
почему-то не склеился...
Это сообщение отредактировал(а) EvgenZ - 16.11.2006, 17:57 -------------------- <удалено администрацией форума> |
|||
|
||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
а почему он должен ругатся??
ф-ия вернула указатель, и локальный указатель удалился, но память то никуда не делась! теперь array указывает на память выделенную в ф-ии.. |
||||
|
|||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 8 Всего: 158 |
все таки очень ты оригинально читаешь код. прочитай еще раз. и попробуй задавать вопросы по коду. |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
EvgenZ Ты же в куче создаешь массив, а не в стеке. Созданый в куче массив умрет только тогда, когда скажешь (delete [] ...), а указатель, когда закончится блок, в котором он объявлен.
|
|||
|
||||
| Oleg_Ci |
|
||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 3 Всего: 30 |
|
||||
|
|||||
| EvgenZ |
|
|||
![]() Freedom in me ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 3.8.2006 Репутация: 1 Всего: 11 |
С указателем я тупанул, почему-то решил, что он в функции увеличения создан
Xenon, после твоего поста стало все понятно, что-то я вообще не туда думал -------------------- <удалено администрацией форума> |
|||
|
||||
| Rockie |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
EvgenZ, закомментировал
-------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |