23.09.2009, 21:05 | #1 (permalink) |
Member
Регистрация: 21.09.2009
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Динамическая память в с\с++
|
23.09.2009, 21:05 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Если поискать по форуму, то можно найти много похожего, рекомендую к прочтению Память Оперативная память |
23.09.2009, 22:09 | #2 (permalink) | |
Member
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
|
Цитата:
Бывает, что без них просто невозможно обойтись - например, когда ты просто не знаешь какой объём данных нужно временно сохранить, а бывает просто становится удобнее. В принципе, в том же C++ сплошь и рядом (особенно в библиотеках по типа C++ Builder, etc) используется похожий механизм - new/delete. В C пореже, но тоже используется - в 99.9% случаев это динамические массивы. Опишу возможные проблемы, основные на вскидку: 1. Нехватка памяти - выделяешь больше чем доступно - ошибка, как, в принципе, и при объявлениях переменных (особенно массивов) в коде программы. С другой стороны - если ты просто объявляешь переменную и не хватает для неё памяти - то твоя программа просто не запустится, а если выделяешь с помощью сабжевых функций - то она вылетит в момент выделения. Но всё же я бы не назвал это проблемой чисто данных функций. 2. Нужно следить, что бы память освобождалась как только больше не нужна - тут бывают проблемы, всё таки код пишут люди - а они не идеальны. Да и в теории может быть не предусмотренный сбой. Поэтому нужно либо тщательно за собой следить и всё перепроверять, либо (что намного-намного лучше) по возможности - инкапсулировать. Если всё-таки инкапсулировать не получается - нужно стараться писать программы так, что бы выделение и освобождение памяти производились , например, в одной функции - и лучше если она будет относительно короткой и атомарной. 3. Если в программе часто происходит выделение/освобождение маленьких кусков памяти - то может возникнуть фрагментация памяти, что, в свою очередь, через некоторое время может привести к недоступности довольно больших объёмов памяти. Тут стратегия борьбы полностью зависит от ситуации. 4. Операция выделения памяти занимает время - где-то больше, где-то меньше - но в общем случае занимает и не так уж и мало. Особенно это касается realloc - т.к. если память сразу за ранее выделенным куском занята, а нужно расширить этот кусок - кусок переносится в другое место. Тут можно посоветовать, например, в случае динамических массивов, делать инкапсуляцию доступа к ячейкам (опять же тут решается проблема с выходом за пределы выделенной под массив памяти) в отдельные функции (например, set и get) или классы (если соответственно это C++). Опять же, оговорюсь, что во многих случаях без этих функций просто не обойтись - в динамических массивах, а также, зачастую, - в паттернах проектирования. P.S. Итог по личному опыту: В C, если есть равнозначный выбор из двух реализаций - как правило лучше использовать всё-таки обычное объявление переменных - всё-таки язык обычно используют для быстроты конечных программ. В C++ - идёт 50 на 50 - в настоящее время, особенно для больших проектов, считается что скорость проектирования главнее скорости работы приложения. А скорость проектирования это паттерны. А там зачастую не обойтись без new/delete. P.P.S. Вот, как-то так. В принципе - вопрос довольно общий - поэтому ответ тоже)) Если интересуют конкретные области применения - то можно поговорить по ним. |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|