Что ДЕЙСТВИТЕЛЬНО происходит, когда вы не освобождаетесь после malloc?

Вы можете легко использовать следующий способ:

INSERT INTO ... ON DUPLICATE KEY UPDATE ...

Таким образом, вы можете вставить любое новое необработанное и если у вас есть повторяющиеся данные, замените определенный столбец (лучшие столбцы - это отметки времени). Например:

CREATE TABLE IF NOT EXISTS Devices (
  id         INT(6)       NOT NULL AUTO_INCREMENT,
  unique_id  VARCHAR(100) NOT NULL PRIMARY KEY,
  created_at VARCHAR(100) NOT NULL,
  UNIQUE KEY unique_id (unique_id),
  UNIQUE KEY id (id)
)
  CHARACTER SET utf8
  COLLATE utf8_unicode_ci;

INSERT INTO Devices(unique_id, time) 
VALUES('$device_id', '$current_time') 
ON DUPLICATE KEY UPDATE time = '$current_time';
494
задан Toby Speight 20 April 2016 в 09:32
поделиться

13 ответов

Примерно каждая современная операционная система восстановит все выделенное пространство памяти после того, как программа выйдет. Единственное исключение, о котором я могу думать, могло бы быть чем-то как Palm OS, где статическое устройство хранения данных программы и память во время выполнения являются в значительной степени тем же самым, таким образом, не освобождение могло бы заставить программу поднимать больше устройства хранения данных. (Я только размышляю здесь.)

Так обычно, нет никакого вреда в нем, кроме стоимости во время выполнения наличия большего количества устройства хранения данных, чем Вам нужно. Конечно, в примере Вы даете, Вы хотите сохранить память для переменной, которая могла бы использоваться, пока это не очищено.

Однако это рассмотрело хороший стиль к свободной памяти, как только Вам больше не нужен он, и освободить что-либо, что Вы все еще имеете вокруг на выходе программы. Это - больше упражнения в знании, какую память Вы используете и думаете о том, нужен ли Вам все еще он. Если Вы не отслеживаете, у Вас могли бы быть утечки памяти.

, С другой стороны, подобное замечание для закрытия файлов на выходе имеет намного более конкретный результат - если Вы не делаете, данные, которые Вы записали в них, не могли бы быть сброшены, или если они - временный файл, они не могли бы быть удалены, когда Вы сделаны. Кроме того, дескрипторам базы данных нужно фиксировать их транзакции и затем закрытый, когда Вы сделаны с ними. Точно так же, если Вы будете использовать объектно-ориентированный язык как C++ или Objective C, не освобождая объект, когда Вы сделаны с ним, будет означать, что деструктор никогда не будут называть, и любые ресурсы, класс ответственен, не могли бы быть очищены.

355
ответ дан Paul Tomblin 20 April 2016 в 19:32
поделиться
  • 1
    что делает слово " сохраненный в database" средства на языке неспециалиста –  6 February 2011 в 14:06

Я думаю, что ваши два примера на самом деле только один: free() должен произойти только в конце процесса, что, как вы указываете, бесполезно, так как процесс заканчивается.

Во втором примере, однако, единственное отличие состоит в том, что вы допускаете неопределенное число malloc(), что может привести к нехватке памяти. Единственный способ справиться с ситуацией - проверить код возврата malloc() и действовать соответствующим образом.

-2
ответ дан mouviciel 20 April 2016 в 09:32
поделиться

Вы абсолютно правы в этом отношении. В небольших тривиальных программах, где переменная должна существовать до самой смерти программы, нет реальной выгоды для освобождения памяти.

Фактически, я когда-то участвовал в проекте, где каждое выполнение программы было очень сложным, но относительно недолгим, и было принято решение просто выделять память и не дестабилизировать проект, совершая ошибки, освобождая его.

Тем не менее, в большинстве программ это на самом деле не вариант, или это может привести к нехватке памяти.

3
ответ дан Uri 20 April 2016 в 09:32
поделиться

Если вы используете выделенную память, значит, вы не делаете ничего плохого. Это становится проблемой, когда вы пишете функции (кроме основной), которые выделяют память, не освобождая ее и не делая ее доступной для остальной части вашей программы. Затем ваша программа продолжает работать с выделенной ей памятью, но никак не может ее использовать. Ваша программа и другие запущенные программы лишены этой памяти.

Редактировать: Не на 100% точно сказать, что другие работающие программы лишены этой памяти. Операционная система всегда может позволить им использовать ее за счет выгрузки вашей программы в виртуальную память (</handwaving>). Однако дело в том, что если ваша программа освобождает память, которую она не использует, то обмен виртуальной памятью с меньшей вероятностью будет необходим.

11
ответ дан Bill the Lizard 20 April 2016 в 09:32
поделиться

При разработке приложения с нуля можно сделать некоторый образованный выбор о том, когда назвать свободным. Ваш пример программы прекрасен: это выделяет память, возможно, у Вас есть он работа в течение нескольких секунд, и затем закрывается, освобождая все ресурсы, которых это требовало.

, Если Вы пишете что-либо еще, хотя - приложение сервера / продолжительное приложение или библиотека, которая будет использоваться кем-то еще, необходимо ожидать называть свободным на всем Вы malloc.

Игнорирование прагматически настроенной стороны в течение секунды, намного более безопасно следовать за более строгим подходом и вынудить себя освободить все Вы malloc. Если Вы не имеете привычку наблюдать за утечками памяти каждый раз, когда Вы кодируете, Вы могли легко пружинный несколько утечек. Так, другими словами, да - можно уйти без него; будьте осторожны, все же.

2
ответ дан ojrac 20 April 2016 в 19:32
поделиться
  • 1
    Термин " домен model" имеет больше ханьцев одно определение. Это может означать модель целого приложения или единственную модель объекта. Это зависит от контекста. – Dave Newton 29 October 2011 в 01:28

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

2
ответ дан Michael 20 April 2016 в 19:32
поделиться

Хорошо абсолютно оставлять память неосвобожденной, когда Вы выходите; malloc () выделяет память от области памяти, названной ""куча"", и полная "куча" процесса освобождена, когда процесс выходит.

Однако одна причина, почему люди все еще настаивают, что хорошо освободить все, прежде чем выход состоит в том, что отладчики памяти (например, valgrind на Linux) обнаруживают неосвобожденные блоки как утечки памяти, и если у Вас есть также "реальные" утечки памяти, становится более трудным определить их, если Вы также получаете "поддельные" результаты в конце.

12
ответ дан Antti Huima 20 April 2016 в 19:32
поделиться

Нет никакого реального опасность в не освобождении Ваших переменных, но если Вы присваиваете указатель на блок памяти к другому блоку памяти, не освобождая первый блок, первый блок больше не доступен, но все еще занимает место. Это - то, что назвало утечку памяти, и если Вы сделаете это с регулярностью тогда, то Ваш процесс начнет использовать все больше памяти, устраняя системные ресурсы из других процессов.

, Если процесс является недолгим, можно часто сходить с рук выполнение этого, поскольку вся выделенная память исправлена операционной системой, когда процесс завершается, но я советовал бы привыкать освобождать всю память, для которой у Вас нет дальнейшего использования.

3
ответ дан Kyle Cronin 20 April 2016 в 19:32
поделиться
  • 1
    It' s одна из тех вещей, что Вы don' t уведомление, пока Вам не нужен он, и с тех пор you' ve никогда не замечал его, Вы don' t знают об этом:) Добавленный одна последняя вещь к моему ответу " Proxies". – David 15 April 2010 в 17:28

=== Что относительно соответствующий требованиям завтрашнего дня и повторное использование кода ? ===

, Если Вы не делаете , пишет код для освобождения объектов, тогда Вы ограничиваете код тем, чтобы только быть безопасным использовать, когда можно зависеть от памяти, являющейся free'd процессом, закрываемым... т.е. маленькие одноразовые проекты использования или "одноразовый" <глоток> [1] проекты)..., где Вы знаете, когда процесс закончится.

, Если Вы делаете , пишут код, настолько свободный () s вся Ваша динамично выделенная память, тогда Вы соответствуете требованиям завтрашнего дня код и позволяете другим использовать его в большем проекте.

<час>

<глоток> [1] относительно "одноразовых" проектов. Код, используемый в "Одноразовых" проектах, имеет способ того, чтобы не быть выброшенным. Следующая вещь Вы знаете десять лет, передала, и Ваш "одноразовый" код все еще используется).

<глоток> я слышал историю о некотором парне, который написал некоторый код только для забавы заставить его аппаратные средства работать лучше. Он сказал" просто хобби, не будет большим и профессиональный ". Несколько лет спустя много людей использует его код "хобби".

55
ответ дан Trevor Boyd Smith 20 April 2016 в 19:32
поделиться

Я обычно свободный каждый выделенный блок, как только я уверен, что сделан с ним. Сегодня, точка входа моей программы могла бы быть main(int argc, char *argv[]), но завтра это могло бы быть foo_entry_point(char **args, struct foo *f) и введено как указатель функции.

Так, если это происходит, у меня теперь есть утечка.

Относительно Вашего второго вопроса, если бы моя программа взяла вход как a=5, я выделил бы место для a или перераспределил бы то же пространство на последующем = "нечто". Это осталось бы выделенным до:

  1. пользователь ввел, 'сбрасывает'
  2. , Моя функция очистки вводилась, или обслуживание сигнала или пользователь ввели 'выход'

, я не могу думать ни о каком современный ОС, которая не исправляет память после того, как процесс выходит. С другой стороны, свободный () является дешевым, почему бы не вымыться? Как другие сказали, инструменты как valgrind являются большими для определения утечек, о которых действительно необходимо волноваться. Даже при том, что блоки у Вас, которые пример был бы маркирован как 'все еще достижимый', его просто дополнительный шум в выводе, когда Вы пытаетесь гарантировать Вам, нет утечек.

Другой миф" , Если в основном (), я не должен освобождать его ", это неправильно. Рассмотрите следующее:

char *t;

for (i=0; i < 255; i++) {
    t = strdup(foo->name);
    let_strtok_eat_away_at(t);
}

, Если это прибыло до разветвления / daemonizing (и в теории, работающей навсегда), Ваша программа только что пропустила неопределенный размер t 255 раз.

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

Действительно, быть добрым к плохой душе, которая должна поддержать Ваш материал, когда Вы идете дальше к другим вещам.. вручите его им 'valgrind чистый':)

23
ответ дан Tim Post 20 April 2016 в 19:32
поделиться

Да Вы правы, Ваш пример не делает ничего плохого (по крайней мере, не в большинстве современных операционных систем). Вся память, выделенная Вашим процессом, будет восстановлена операционной системой, как только процесс выходит.

Источник: Выделение и Мифы о GC (предупреждение PostScript!)

Миф о Выделении 4: несобравшие "мусор" программы должны всегда освобождать всю память, которую они выделяют.

Истина: Опущенное освобождение в часто выполняемых утечках роста причины кода. Они редко приемлемы. но Программы, которые сохраняют наиболее выделенную память до выхода программы часто, работают лучше без любого прошедшего освобождения. Malloc намного легче реализовать, если там не свободно.

В большинстве случаев, память освобождения непосредственно перед тем, как выход программы бессмыслен. ОС исправит его так или иначе. Касание доброй воли и страница в мертвых объектах; ОС не будет.

Последствие: Будьте осторожны с "детекторами утечки" то количество выделения. Некоторые "утечки" хороши!

Тем не менее необходимо действительно стараться избегать всех утечек памяти!

Второй вопрос: Ваш дизайн в порядке. Если необходимо сохранить что-то, пока приложение не выходит тогда из хорошо, чтобы сделать это с динамическим выделением памяти. Если Вы не знаете необходимого размера заранее, Вы не можете использовать статически выделенную память.

106
ответ дан Csq 20 April 2016 в 19:32
поделиться
  • 1
    спасибо за Ваше объяснение, таким образом, TR имеют некоторую проблему со слайдом effect.how, я могу решить его? я can' t получают TR, любая height.its высота определяется ее содержанием. – hd. 27 February 2011 в 05:14

Этот код будет обычно работать хорошо, но рассматривать проблему повторного использования кода.

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

Тогда кто-то еще копирует Ваш отрывок в его проект таким способом, которым он выполняется одну тысячу раз в секунду. У того человека теперь есть огромная утечка памяти в его программе. Не очень хороший в целом, обычно фатальный для серверного приложения.

Повторное использование кода типично на предприятиях. Обычно компания владеет всем кодом, который производят ее сотрудники, и каждый отдел может снова использовать то, чем владеет компания. Таким образом путем писания такого "выглядящего словно невинно" кода Вы вызываете потенциальную головную боль другим людям. Это могло уволить Вас.

11
ответ дан WedaPashi 20 April 2016 в 19:32
поделиться
  • 1
    Право. Я don' t знают о любом способе сделать < tr> скатиться. По крайней мере, в хроме, там высоты НЕ понизятся, чем минимум для показа содержания. Мое решение состояло в том, чтобы использовать < div> s. Я отправил jsfiddle выше, но здесь являюсь ссылкой снова: jsfiddle.net/BU28E/2 – jwegner 27 February 2011 в 20:04

Вы правы, вреда нет и быстрее просто выйти

Для этого есть различные причины:

  • Все окружения рабочего стола и сервера просто освобождают всё пространство памяти при выходе из функции exit(). Они не знают о внутрипрограммных структурах данных, таких как кучи.

  • Почти все реализации free() все равно никогда не возвращают память в операционную систему.

  • Более важно, что это пустая трата времени, когда это делается прямо перед exit(). При выходе просто освобождаются страницы памяти и пространство подкачки. Напротив, серия free() вызовов будет записывать процессорное время и может привести к операциям подкачки диска, пропуску кэша и вытеснению кэша.

Что касается возможности повторного использования будущего кода, оправдывая уверенность бессмысленных оп: это рассмотрение, но это, вероятно, не Agile способ. YAGNI!

49
ответ дан 22 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: