![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
в общем смысле динамическое использование памяти нужно для контроля времени жизни объекта
при использовании стека если объект1 создан раньше объекта2, то уничтожен он будет позже именно из этого ограничения исходит скорость работы - функции выделения освобождения памяти зачастую сводятся к одной команде процессора, а проблемы поиска и фрагментации не возникают в принципе (ну ещё на скорость влияет то, что чаще всего стек находится в кеше, а значит не нужно его ниоткуда доставать, но это уже зависит от платформы) если вернуться к C++, то ещё одно достоинство (которое уже упоминали) - автоматическое удаление выделенного объекта при выходе из блока, так что забыть это сделать невозможно лично я стараюсь по минимуму использовать динамическую память и другое выделение ресурсов, которые потом нужно явно освобождать, только когда без этого сложно обойтись (как уже привели пример с неизвестным количеством элементов) или это сильно повышает эффективность (когда она критична), но даже в этих случаях (особенно когда программа сложная) не помешает упаковать управление этими ресурсами в какой-нибудь класс, который будет следить за ними (для всяких массивов чаще всего подходит std::vector)... -------------------- qqq |
|||
|
||||
UnrealMan |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
А под статически объявленный массив память тоже может выделяться динамически (если он объявлен как член класса и память под объект такого класса выделяется динамически). По поводу отличий ничего говорить не буду, ибо вопрос – суть боян. В И-нете полно литературы – читай и просвещайся. Всё равно по-нормальному научиться чему-то без книг, задавая подобные вопросы на форумах, вряд ли получится. Б. Страуструп: «Язык программирования С++ (2-е дополненное издание)» 3.2.6 Свободная память.
Необязательно. Из-за оптимизации это правило может быть нарушено, например:
вывод (MinGW-3.4.4):
– т.е. объект a2 функции func может быть создан прямо на месте объекта a в функции main и уничтожен только по завершении main. |
||||||||
|
|||||||||
ali01 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 29.7.2007 Репутация: нет Всего: нет |
А где же про классы? есть вопрос если в классе создаются динамические переменные, в деструкторе надо вызывать delete?
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Если где-то сделан new, то обязательно должен быть выполнен соответствующий delete. Иначе никак. И не важно где, в классах, структурах или функциях. |
|||
|
||||
ali01 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 29.7.2007 Репутация: нет Всего: нет |
Деструктор сам этого не делает? А когда автоматически создаешь класс например в VC там создается пустой конструктор, я так понял надо самому там прописывать delete?
|
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
||||
|
||||
ali01 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 29.7.2007 Репутация: нет Всего: нет |
Да, запутался. Я понял, спасибо. Раньше думал деструктор сам все сделает
![]() |
|||
|
||||
ali01 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 29.7.2007 Репутация: нет Всего: нет |
Просматривал код wxFormBuilder, пример конструктора:
и деструктора:
Там вообще нет delete. Или может я что-то не понял? |
||||||||
|
|||||||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
ali01, посмотри деструкторы базовых классов. Там(чуть ли не на самом верху иерархии) должны быть примерно следующие строки:
Во всяком случае в известных мне тулкитах(Qt, VCL) все компоненты хранятся и удаляются единообразно(т.о. позволяя не заботиться о MM... хорошо это или плохо - вопрос другой темы). -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 6 Всего: 93 |
Это сообщение отредактировал(а) archimed7592 - 8.1.2008, 16:02 -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
anatox91 |
|
|||
![]() программист-самоучка ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: 1 Всего: 13 |
ManiaK, большое спасибо за интересную статью и своеобразный стиль изложения
![]() Тема разделена: Возвращение указателя на локальный объект, warning C4172: returning address of local variable or temporary. Это сообщение отредактировал(а) archimed7592 - 3.2.2008, 00:52 -------------------- The code is the design © Sony VAIO VGN-FW480J ![]() |
|||
|
||||
Annuta |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 3.10.2006 Где: Dubna Репутация: нет Всего: 1 |
У меня такой вопрос - есть ли разница между этими двумя объявлениями. Какое из них более рационально ?
TMinuit *min = new TMinuit(6); TMinuit min(6); --------------------
Программист - это комбинация лени и логики ! |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Второе. Если есть желание обсудить этот вопрос, то лучше создать отдельную тему |
|||
|
||||
XeS |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 6.4.2008 Репутация: нет Всего: нет |
Маленький вопросик по работе с указателями
это как я понимаю массив из 10 указателей, т.е я с ним работаю так
а конструкция такого вида
это указатель на массив из 10 int я с ним работаю так
я прав???? |
||||||||
|
|||||||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 9 Всего: 14 |
нет можно так:
технически int* и int(*)[n] - разные типы, и данная запись несколько бессмысленна... ну разве что вам надо передавать p в функцию принимающую конкретно int(*)[n] но той-же функциональностью обладает следующий код:
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "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. |