• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Динамическая память в с\с++

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

voipp

Новые
Регистрация
21 Сен 2009
Сообщения
23
Реакции
0
Баллы
0
Динамическая память в с\с++

Насколько нежелательно часто использовать функции new malloc realloc в программах? Может ли это как-то сказываться на памяти или еще как-то?
 
Насколько нежелательно часто использовать функции new malloc realloc в программах? Может ли это как-то сказываться на памяти или еще как-то?

Вопрос не настолько однозначный, каким кажется на первый взгляд. Одного решения точно нет.
Бывает, что без них просто невозможно обойтись - например, когда ты просто не знаешь какой объём данных нужно временно сохранить, а бывает просто становится удобнее.

В принципе, в том же 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. Вот, как-то так. В принципе - вопрос довольно общий - поэтому ответ тоже)) Если интересуют конкретные области применения - то можно поговорить по ним.
 
Назад
Сверху