![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
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 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |