Управление памятью и сборщики мусора

  • Автор темы Creo
  • Дата начала
C

Creo

#1
При более подробном изучении С++ столкнулся с проблемой управлением памятью. Которой как оказывается, в данном языке, можно и даже нужно управлять ;) :) .
Может кто подскажет, где найти толковые книги, статьи по менеджерам памяти и сборщикам мусора. Google не помог(только больше вопросов появилось...) ;)
Зарание благодарен
 

Kmet

Java Team
25.05.2006
1 036
8
#3
сборщик мусора нужен с++ как зайцу стоп сигнал. в большинстве случаев можно выделить память на стеке, о ее освобождении позаботится компиляторов, для случаев выделения памяти а куче существуют smart pointers(например std::auto_ptr).
 
C

Creo

#4
Хочешь свой написать или готовый заиспользовать?
Вообще-то свой написать....

Просто меня интересует более тонкая рабата с памятью, чем просто использование new и delet. Во первых оператор new требует конструктора по умалчанию, а во вторых, если данный конструктор в классе все таки есть, то он будет инициализировать память данным значением. А если я хочу выделить память, но не инициализировать ее? Что тогда делать? Как избежать утечки памяти? В каких ситуациях данная утечка может произойти и т.д?

Тем более такие знания я думаю лишними не будут. :)
 

grigsoft

Well-known member
15.11.2005
735
0
#5
А зачем тебе объект класса с невалидными данными? Чтобы он сложился при вызове, который ты добавишь через полгода, забыв что для работы с твоим экземпляром надо сначала танцы с бубном сделать? А если это твой класс, то сделай просто конструктор без инициализации, хотя это и плохая практика.
По теме - как всегда, рихтер рулит - про свои хипы, внутреннюю механику Win32 при работе с памятью и т.п.
 
04.09.2006
2 566
3
#6
<!--QuoteBegin-Creo+22:12:2006, 09:14 -->
<span class="vbquote">(Creo @ 22:12:2006, 09:14 )</span><!--QuoteEBegin-->Просто меня интересует более тонкая рабата с памятью, чем просто использование new и delete
[snapback]51409" rel="nofollow" target="_blank[/snapback]​
[/quote]
Куда уж тоньше!<!--QuoteBegin-Creo+22:12:2006, 09:14 -->
<span class="vbquote">(Creo @ 22:12:2006, 09:14 )</span><!--QuoteEBegin-->А если я хочу выделить память, но не инициализировать ее?
[snapback]51409" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну для этого есть HeapAlloc и т.д. А вообще, grigsoft прав: Рихтер однозначно.
 
C

Creo

#7
Привожу пример, что бы было понятно, что я имел в виду. Допустим класс - это вектор использующий динамический массив для хранения данных. Так вот, добавлять каждый новый элемент переписывая массив просто глупо. Естественно, хотелось бы зарезервировать память для новых элементов. Но если таких элементов к примеру 10 000 :( и каждый будет инициализирован оператором new. Потом придется инициализировать их еще раз присваивая уже нужное мне значение. Кажется не совсем эффективно :) . Ах да! потом исчерпается и эта память и мне еще понадабиться память для 10 000 элементов :) , Корочем с new получаеться лажа. Пока программа обработает все данные я успею чайку попить. :)
 

grigsoft

Well-known member
15.11.2005
735
0
#8
А, ну я так и думал, примерно :) Для начала лучше все таки страуструпа прочитать - про классы, конструкторы и работу с памятью.
Код:
Class* pData = new Class[1000];
спасет отца русской демократии. Только ни менеджеры памяти, ни, тем более, сборщики мусора не имеют к этому отношения. Простейший буфер, который отдает по одному указателю, выделяя большим куском. А все извращения со сверх-оптимизацией, приведут к тому что в следующей версии тебе придется добавить член класса, нетривиальный в инициализации, и придется ломать голову над расширением.

Ну еще про свои хипы можешь почитать у рихтера - возможно тебе именно этого хочется (HeapCreate и прочие).
 
C
#10
Для: grigsoft
Код:
Class* pData = new Class[1000];
Простейший буфер, который отдает по одному указателю, выделяя большим куском.
И инициализирует 1000 эл-тов :angry: . Ну вот они закончились и ваши действия дальше...
Код:
Class* pnewData = new Class[2000];
for (int i=0;i<1000;i++){
*pnewData++ = *pData++;}
?????????
Но это ведь то о чем я писал выше... Или может я не прав?
 

grigsoft

Well-known member
15.11.2005
735
0
#11
А зачем? Тебе надо чтобы они одним куском лежали? Выдели еще 1000 в аналогичном массиве. Или сделай массив указателей и в него складывай указатели на выделенные ранее элементы. Вопрос что тебе надо в конкретном случае.
То что ты, видимо, хочешь сделать - и есть частный хип, который делается HeapCreate - и в принципе есть смысл его использовать для выделения множества одинаковых маленьких объектов. Хотя лично я предпочитаю прозрачность - написал простенький класс темплейтный, который как раз выделяет блоками, а отдает указатели по одному. Мне, правда, не надо было их удалять в процессе - документ открывется, память выделяется, в процессе редактирования что удаляется - просто игнорируется. При закрытии документа - команда контейнеру Reset, и он готов отдавать ту же память опять. Если сюда добавить еще управление удаленными (даже простой стек из свободных блоков) - получится практический готовый хип, а в таком случае лучше уже системный использовать.
 
C
#12
Ну для данной конкретной задачи, что я описал, то да.
Есть класс Allocator, но где про него прочитать, видимо он предостовляет подобные ф-ции.
Может то что я хочу написать и есть хип :) только я к сожалению об этом не знаю. По этому и просил посоветовать статеек и книг каких, ссылки тоже приветствуются. Просто в этом вопросе не совсем, как видете ориентируюсь.
 
04.09.2006
2 566
3
#13
Для: Creo
Класс allocator определен в стандартной библиотеке С++, поэтому прочитать про него можно в MSDN или в книжках по STL

Например, про распределители памяти есть в Страуструпе (глава 19.4 третьего русского издания)
 
C
#14
Огромное спасибо. Хоть понятно в каком направлении теперь "рыть землю" и "грызть гаранит науки". Но я не считаю данный топик закрытым, так что если у кого есть какие мысли по этому поводу пожалуйста отпишите.