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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Creo, 21 дек 2006.

  1. Creo

    Creo Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Хочешь свой написать или готовый заиспользовать?
     
  3. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    сборщик мусора нужен с++ как зайцу стоп сигнал. в большинстве случаев можно выделить память на стеке, о ее освобождении позаботится компиляторов, для случаев выделения памяти а куче существуют smart pointers(например std::auto_ptr).
     
  4. Creo

    Creo Гость

    Вообще-то свой написать....

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

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    А зачем тебе объект класса с невалидными данными? Чтобы он сложился при вызове, который ты добавишь через полгода, забыв что для работы с твоим экземпляром надо сначала танцы с бубном сделать? А если это твой класс, то сделай просто конструктор без инициализации, хотя это и плохая практика.
    По теме - как всегда, рихтер рулит - про свои хипы, внутреннюю механику Win32 при работе с памятью и т.п.
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--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 прав: Рихтер однозначно.
     
  7. Creo

    Creo Гость

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

    grigsoft Well-Known Member

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

    Ну еще про свои хипы можешь почитать у рихтера - возможно тебе именно этого хочется (HeapCreate и прочие).
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Creo
    Немного не то, что тебе надо, но может заинтересует: Visual Leak Detector
     
  10. Creo

    Creo Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    А зачем? Тебе надо чтобы они одним куском лежали? Выдели еще 1000 в аналогичном массиве. Или сделай массив указателей и в него складывай указатели на выделенные ранее элементы. Вопрос что тебе надо в конкретном случае.
    То что ты, видимо, хочешь сделать - и есть частный хип, который делается HeapCreate - и в принципе есть смысл его использовать для выделения множества одинаковых маленьких объектов. Хотя лично я предпочитаю прозрачность - написал простенький класс темплейтный, который как раз выделяет блоками, а отдает указатели по одному. Мне, правда, не надо было их удалять в процессе - документ открывется, память выделяется, в процессе редактирования что удаляется - просто игнорируется. При закрытии документа - команда контейнеру Reset, и он готов отдавать ту же память опять. Если сюда добавить еще управление удаленными (даже простой стек из свободных блоков) - получится практический готовый хип, а в таком случае лучше уже системный использовать.
     
  12. Creo

    Creo Гость

    Ну для данной конкретной задачи, что я описал, то да.
    Есть класс Allocator, но где про него прочитать, видимо он предостовляет подобные ф-ции.
    Может то что я хочу написать и есть хип :) только я к сожалению об этом не знаю. По этому и просил посоветовать статеек и книг каких, ссылки тоже приветствуются. Просто в этом вопросе не совсем, как видете ориентируюсь.
     
  13. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Для: Creo
    Класс allocator определен в стандартной библиотеке С++, поэтому прочитать про него можно в MSDN или в книжках по STL

    Например, про распределители памяти есть в Страуструпе (глава 19.4 третьего русского издания)
     
  14. Creo

    Creo Гость

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

Поделиться этой страницей