Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильное использование динамической памяти, Корректно используем кучу в связке клас 
:(
    Опции темы
BadPointer
Дата 7.12.2013, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.9.2009

Репутация: нет
Всего: нет



Добрый вечер! 
При проектировании свяки классов, возник вот такой вопрос по динамическому выделению памяти объектам класса:

Допустим, у нас есть схема: класс DocumentManager, который создается в динамической памяти при запуске приложения: 
DocumentManager * pDocMan = new DocumentManager().
В распоряжении его находятится список объектов класса Document.Допустим, они хранятся в списке:  std::list<Document*>, под который мы также выделяем динамическую память: std::list<Document*> = new std::list<Document*>(). 
Класс Document - объект этого класса может хранить большое количество данных, в данном случае, напрмер,  карта, хранящая несколько тысяч именованнных структур: std::map<CString, TSomeStruct>.

Вопросы:
1. Если объект класса DocumentManager создается при запуске программы в динамической памяти, значит ли что нет смысла создавать список std::list<Document*> в динамической памяти. Т.е при создании объекта все его данные будут размещены в куче? Но что будет, если список std::list<Document*> создать в динамической памяти в конструкторе объекта DocumentManager? Они уже не будут входить в область данных, занимаемой объектом класса DocumentManager?
2.  Если объект класса Document будет хранить в себе многие тысячи строк в карте std::map<CString,TSomeStruct>, имеет ли смысл размещать переменную типа: std::map<CString,TSomeStruct> m_SturctMap  в динамической памяти, или достаточно разместить объект класса Document в динамической памяти, а досуп к списку оставить по значению? Может ли есть какие-то правила, в зависимости от которых объект класса или отдельные поля класса должны размещаться в динамической памяти? Как кто определяет, эту переменную я сделаю указателем на выделенную область памяти, а доступ к этой будет по значению? В каких случаях объект класса нужно создавать в динамической памяти?   
3. Дело ли в размере переменной, которая хранит данные класса - на основе только ли размера принимается решении о выделении памяти в куче? 

Буду благодарен за ответы! 

PM MAIL   Вверх
tzirechnoy
Дата 8.12.2013, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: -1
Всего: 16



Цитата
значит ли что нет смысла создавать список std::list<Document*> в динамической памяти.


Нет, не значит. Объекты создаются в динамической памяти тогда, когда их либо невозможно либо неэффективно создавать в виде полей или переменных ужэ существующих сущеностей. Невозможно обычно из-за неизвестного количества объектов либо из-за требований полиморфизма (нельзя просто так взять и присвоить значение класса-потомка классу-предку, а вот ссылку или указатель типа класс-потомок присвоить ссылке или указателю на класс-предок -- можно), неэффективно -- из-за ожыдаемого времени жызни объекта, несовпадающего с временем жызни сущностей в которых они порождаются.

Соответственно, вопрос, выделять ли для std::list<Document *> память динамически -- ортогонален вопросу, выделена ли динамически память для DocumentManager. Анализировать надо сравнительное время существования этих двух переменных и возможность обойтись ограниченным количеством std::list (впрочем, учитывая, что std::list -- контэйнер, им как раз часто одним обходятся дажэ для очень сложных случаев).

Цитата
будет хранить в себе многие тысячи строк в карте std::map<CString,TSomeStruct>, имеет ли смысл размещать переменную типа: std::map<CString,TSomeStruct> m_SturctMap  в динамической памяти


См.вышэ, это вообще безразлично. Вопрос только -- сможэшь ли ты так сделать или нет.

Да, замечу, что контэйнеры std::list и std::map сами выделяют себе динамическую память для хранения элементов по мере надобности. Независимо от того, как они описаны: глобальной переменной, переменной на стэке или выделены динамически.
PM MAIL   Вверх
xvr
Дата 9.12.2013, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Как совершенно правильно заметил tzirechnoy, контейнеры (в том числе и std::list и std::map да и вообще все std::*) хранят данные своих клиентов в куче, поэтому располагать их самих в куче смымла нет никакого - их размер не превышает размера пары указателей, и не зависит от содержимого. Хранить в них вместо объектов указатели на них тоже не имеет смысла (по крайней мере для list и map), т.к. помещенные в них один раз объекты никуда не копируются (но это верно не для всех контейнеров!). Поэтому помещать в них указатели на объекты в куче - это лишняя трата кучи, приводящая к ее фрагментации и неэффективному использованию.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.