![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Когда именно надо использовать операторы new и delete ??
|
|||
|
||||
Annihilator |
|
|||
![]() bytegrinder ![]() ![]() Профиль Группа: Участник Сообщений: 493 Регистрация: 21.11.2006 Где: Омск Репутация: 1 Всего: 3 |
Хм... ну самое простое если, когда хочешь создавать переменные в run-time, т.е. по пере надобности
-------------------- Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
имеется ввиду просто new и delete или operator new и operator delete? |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 2 Всего: 10 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
применять рекомендуется очень осторожно и только тогда, когда знаешь, что делаешь . эти операторы перегружаются , когда хотят изменить способ аллокации памяти, например когда используется значительное множество мелких объектов (потому что намного эфективнееее выделить кучу и распределять между мелкими, чем для каждого выделять в куче) |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Ну вот к примеру:
Так в каких случаях использовать эти операторы ??? |
|||
|
||||
IKM2007 |
|
|||
![]() Зима близко ![]() ![]() Профиль Группа: Участник Сообщений: 702 Регистрация: 26.4.2008 Где: olmedreca Репутация: 3 Всего: 40 |
-------------------- "К чёрту обстоятельства, я создаю возможности." Брюс Ли |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
new (и соответственно потом delete) в данном случае используются для динамического распределения памяти. Из этого и исходи. Собственно нужен ли тебе указатель или нет.
|
|||
|
||||
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
я не понял в чем вопрос, в первом случае вызовется оператор new, во втором нет, так как память под объект выделяется в стэке... что ты хочешь от операторов new/delete? этот оператор должен просто вернуть указатель на область памяти, по которому будет конструироваться объект |
||||
|
|||||
bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Эти операторы нужно использовать тогда, когда без них никак не обойтись. Например, для идиомы pimpl без них не обойтись. Во всех остальных случаях, применение их рекомендуется избегать. Например, если тебе нужен массив переменной длины, то можно это сделать так:
|
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Так все таки значит просто вопрос по использованию глобального new и delete ?
Это сообщение отредактировал(а) mes - 27.8.2008, 10:52 |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
НЕУЖЕЛИ ТРУДНО ОТВЕТИТЬ, В КАКИХ СЛУЧАЯХ НАДО ПОД КЛАСС ВЫДЕЛЯТЬ ДИНИМИЧЕСКУЮ ПАМЯТЬ ???))))) |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Под классы выделять память не нужно! Нужно выделять под объекты классов (под переменные, другими словами). Выделять нужно тогда и только тогда, когда за тебя это никто не сделает. Когда ты пишешь MyClass var, то за тебя выделяет память компилятор. Когда ты пишешь MyClass *pointer, то ты берешь на себя обязательства как-нибудь инициализировать указатель. Есть два варианта: либо присвоить адрес существующего объекта, либо создать новый с помощью new. Если все еще непонятно - беги срочно в магазин, покупай книжку по программированию (С++) для начинающих и читай до просветления! |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
это большая тайна под семью печатями. ![]()
ну все секретные места сдал )) P.S. GLeBaTi, проверьте, пожалуйста, что там у Вас с клавой .. не шифт ли заклинил? а то слишком громко пишет.. ![]() Это сообщение отредактировал(а) mes - 27.8.2008, 11:31 |
||||
|
|||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Не могли порсто сказать: "new - для создания указателя на объект переменной длины"
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
судя по фразе Вы даже не ознакомились с примером : http://forum.vingrad.ru/index.php?showtopi...t&p=1623276 отделяйте котлеты от мух: . new нужен для создания объекта в динамической памяти. а уж будет ли его адрес присвоен указателю или нет это отдельная строчка кода. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Нет. потому что это не так. |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
ppc... я знаю что нужен для создания объекта в динамической памяти, я спрашивал в каких случаях нужно его использовать -
в тех случаях когда надо определить указатель на объект нужной длины... |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Опять неправильно. И вообще, понятия "объект переменной длины" нет. Есть массивы переменной длины. Но new используется не только для них: http://www.insidecpp.ru/patterns/pimpl_idiom/ Добавлено @ 12:23 Уже сто раз было сказано, что new нужно для создания объектов в "куче" (не в стеке), так как стековые объекты уничтожаются при выходе из области видимости (изнутри фигурных скобок), а те, что в куче, живут или до уничтожения оператором delete, или до завершения работч программы. Это сообщение отредактировал(а) bsa - 27.8.2008, 12:24 |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Ладно, спасибо, Я уже разобрался...
![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
указатель на объект и объект - два разных понятия.. и с помошью оператора "=" мы их связываем т.е присваеваем (записываем в память указателя) адрес объекта, но не присваеваем указателю сам объект или его память. Т Так же когда вносим в телефоную книжку номер телефона, мы никак не воздействуем на сам телефон. Нам это лишь дает возможность воспользоваться услугами конкретно выбранного объекта (из кучи других ) , при условии если он может нам их представить (не поломан и не отключен). ![]() Это сообщение отредактировал(а) mes - 27.8.2008, 12:52 |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
...а если надо изменить размер массива?...перекомпилировать будем ???
С помощью new можно выделять память динамически во время выполнения снимает с ваших программ зависимость от фиксированных размеров массивов. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
читаем про std::vector. Кроме new/delete есть еще Сишные средства: calloc/malloc/realloc/free Я уже привел пример, когда new используется не для массивов. |
|||
|
||||
Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
постараюсь объяснить проще... допустим есть класс
такой класс только один, далее нам нужно его использовать, для этого нужно создать экземпляр этого класса. как это происходит:
память под объект может выделяться в стеке и в куче в стеке она выделяется так:
для выделения памяти в области стека достаточно изменить значение регистра SP, поэтому память выделяется оч. быстро, практически мгновенно, недостаток этого метода в том, что объект живет не долго, как только он выходит из области видимости, он уничтожается, а память освобождается, к тому-же стек не резиновый(хоть и может расти динамически) и если там создать слишком много объектов он переполнится. приемущество - в том, что объекты не надо удалять вручную, они удаляться автоматически. в куче память выделяется так:
здесь pobject это указатель на объект расположеный в куче, то-есть по сути адрес объекта. Память в куче выделяется менеджером памяти, который реализуется библиотекой времени выполнения (CRTL), и выделяется она сравнительно долго. Объекты находящиеся в куче нужно удалять вручную, так как к стеку они не привязаны(если конечно специально об этом не позаботиться) и при его раскрутке не будут удалены. Но зато куче можно размещать оч. большие объекты. Так-же существует возможность немного изменить это поведение с помощью переопределения операторов new/delete. Это редко используется, так как редко бывает нужно. Задача переопределенного оператора new - возвратить указатель на область памяти, в котором потом будет создаваться объект. Еще нужно сказать, что если ты переопределяешь оператор new, то прийдется переопределить оператор delete, а так-же nothrow версию new, а так-же new [] |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Во первых new не только для массивов. Во вторых чтоб иметь динамические массивы не обязательно пользоваться открытым new. Для этого есть удобные оболочки(например std::vector) , снимаюшие заботу о контроле за жизнью динамических данных с программиста, и о которых не раз говорилось выше Это сообщение отредактировал(а) mes - 27.8.2008, 12:57 |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Lazin: вот то, что я хотел услышать))) Спасибо.
Добавлено через 5 минут и 5 секунд А вот когда создаёшь кнопку: CButton, надо выделять под нее память в стеке или в куче ? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Думаю, тебе с этим вопросом лучше в раздел по MFC обратиться... Но, на сколько мне известно, уже и MS от этого MFC отказываться начала. Пора переходить на что-то более современное и удобное. |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Раскрутка стека - это когда при запуске исключения автоматически вызываются деструкторы всех стековых
объектов между throw и catch. Значит, если объект будет создан в куче, и вызовется исключение, то объект не уничтожится ?? Добавлено через 2 минуты и 2 секунды Скоро я начну изучеть .Net framework |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
нет.. об исключениях речи не было.. раскрутка стека происходит при выходе за границы области видимости
A вобше когда задаете вопросы старайтесь хотя бы немного внимания уделять полученным ответам.. Выше по теме уже все это объяснялось.. Если бы Вы их разобрали бы, а не строили бы пустые догадки, то не было бы столько повторенья... Это сообщение отредактировал(а) mes - 27.8.2008, 13:48 |
||||
|
|||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
![]() |
||||
|
|||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Что-то я не помню чтобы в теме, говорилось о том, что при выходе из области видимости, происходит удаление ненужных объектов из стека...
|
|||
|
||||
W4FhLF |
|
||||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Плохо у тебя с памятью парень.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||||
|
|||||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
аааа, я спутал область видимости с переполнением)))...во я дурак))
А если объект создать статический ??? То тогда память не освобождается... |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 2 Всего: 121 |
Тогда память под объект резервируется в глобальной секции данных ещё на этапе компиляции.
Это сообщение отредактировал(а) W4FhLF - 27.8.2008, 14:17 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
смотря что Вы под этим понимаете 1 глобальные объекты удаляется при выходе за границу глобальной области видимости.. (при завершении программы) 2 данные расположенные в секции данных не инициализируются и не уничтожаются Это сообщение отредактировал(а) mes - 27.8.2008, 14:20 |
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Пора закрывать эту тему))) Всем спасибо)
![]() |
|||
|
||||
NebelDT |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.9.2008 Где: RU Репутация: -6 Всего: -10 |
new (и соответственно потом delete) в данном случае используются для динамического распределения памяти. Например неизвестна длинна массива!!!
![]()
|
|||
|
||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
сПАсибоЮ, но я уже полностью разобрался)
|
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Ты не поверишь! Но можно и так:
|
||||
|
|||||
GLeBaTi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 1.2.2008 Где: г.Чебоксары Репутация: -1 Всего: 0 |
Извини, но,кажется, что:
не скомпилируется, т.к компилятор должен знать размер массива до компиляции. ![]() |
|||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
а ты попробуй динамические массивы еще в 98-м кажется ввели что за ботва... я абсолютно помню что вводили... Это сообщение отредактировал(а) J0ker - 1.10.2008, 17:41 |
||||
|
|||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
||||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
ммм... изучаю вопрос... |
|||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
вопрос изучен variable-sized arrays были введены в C99 - который сейчас является C-стандартом, и, эатем, в C++98 - который НЕ является C++ стандартом Т.о. это поддерживается компиляторами, заявленными как C-complaint (GCC например) VC этот стандарт не поддерживает на данный момент будет ли это добавлено в новом стандарте пока не знаю - выясню напишу |
||||
|
|||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |