То, почему свободно () не позволенный войти, собрало "мусор" языки?

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

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

То есть для логики, которая не должна быть связана, используйте JS-модуль / класс в отдельном файле и используйте require / import, чтобы отделить компонент от «услуга».

Это позволяет осуществлять инъекцию зависимостей и модульное тестирование этих двух независимо.

17
задан sundar - Reinstate Monica 4 May 2010 в 14:45
поделиться

9 ответов

Сборка мусора обеспечивает безопасность типов распределителя памяти, гарантируя, что выделения памяти никогда не будут псевдонимами. То есть, если часть памяти в настоящее время рассматривается как тип T, распределитель памяти может гарантировать (с помощью сборки мусора), что пока эта ссылка жива, она всегда будет ссылаться на T. Более конкретно, это означает, что распределитель памяти никогда не вернет эту память в другом типе.

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

Это не значит, что это невозможно; если бы вы могли выразить однореферентный тип, вы могли бы управлять им вручную. Но в этом случае было бы проще либо отказаться от использования языка GC, либо просто не беспокоиться об этом.

5
ответ дан 30 November 2019 в 14:12
поделиться

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

Среди предотвращенных проблем:

  • Двойной free() с
  • Вызов free() по указателю на память, которой вы не владеете, что приводит к несанкционированному доступу в других местах
  • Вызов free() для указателя, который не был возвращаемым значением функции выделения, например, для получения адреса некоторого объекта в стеке или в середине массива или другого выделения.
  • Разыменование указателя на память, которая уже была free() d

Кроме того, автоматическое управление может привести к повышению производительности, когда ГХ перемещает живые объекты в консолидированную область. Это улучшает локальность ссылок и, следовательно, производительность кэша.

10
ответ дан 30 November 2019 в 14:12
поделиться

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

1
ответ дан 30 November 2019 в 14:12
поделиться

Я не могу сказать, что это ответ , но приходит на ум, что если вы можете бесплатно , вы можете случайно удвоить освободить указатель / ссылку или, что еще хуже, использовать один за другим. Что противоречит основному принципу использования таких языков, как c # / java / etc.

Конечно, одним из возможных решений этой проблемы было бы, чтобы ваш бесплатный принимал аргумент по ссылке и после освобождения устанавливал для него значение null . Но тогда, что, если они передадут r-значение следующим образом: free (something ()) . Я полагаю, у вас может быть перегрузка для версий с r-значением, но вы даже не знаете, поддерживает ли C # такую ​​вещь: -P.

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

0
ответ дан 30 November 2019 в 14:12
поделиться

Достаточно интересно, что у вас есть доступ к сборщику мусора через System.GC - хотя, судя по всему, что я читал, настоятельно рекомендуется разрешить сборщику мусора управлять самим собой.

Однажды мне посоветовали использовать следующие 2 строки от стороннего поставщика для решения проблемы сборки мусора с помощью объекта DLL, COM или чего-то подобного:

// Force garbage collection (cleanup event objects from previous run.)
GC.Collect();         // Force an immediate garbage collection of all generations
GC.GetTotalMemory(true);

Тем не менее, я бы не стал возиться с System. GC, если я точно не знал, что происходит под капотом. В этом случае совет стороннего поставщика «устранил» проблему, с которой я имел дело, относительно их кода. Но я не могу не задаться вопросом, действительно ли это было обходным путем для их неработающего кода ...

0
ответ дан 30 November 2019 в 14:12
поделиться

Вызов GC.Collect почти всегда лучше, чем наличие явного бесплатного метода. Вызов free имеет смысл только для указателей / ссылок на объекты, на которые есть ссылки из ниоткуда. Это то, что подвержено ошибкам, поскольку есть вероятность, что ваш вызов free для указателя неправильного типа.

Когда среда выполнения ссылается на подсчет мониторинга для вас, она знает, какие указатели могут быть освобождены безопасно, а какие нет, поэтому позволяя сборщику мусора решать, какая память может быть освобождена, избегает класс дыр уродливых ошибок. . Можно подумать о реализации среды выполнения с GC и free , где явный вызов free для одного блока памяти может быть намного быстрее, чем выполнение полного GC.Collect (но не ожидайте, что освобождение каждого возможного блока памяти «вручную» будет быстрее, чем сборщик мусора). Но я думаю, что разработчики C #, CLI (и других языков со сборщиками мусора, таких как Java) решили отдать предпочтение надежности и безопасности, а не скорости.

1
ответ дан 30 November 2019 в 14:12
поделиться

Если вы находитесь в ситуации, когда «не хотите полагаться на умный сборщик мусора», то, скорее всего, вы неправильно выбрали фреймворк для своей задачи. В .net вы можете немного манипулировать GC ( http://msdn.microsoft.com/library/system.gc.aspx ), в Java - нет.

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

0
ответ дан 30 November 2019 в 14:12
поделиться

Ручное управление разрешено. Например, в Ruby вызов GC.start освободит все, что может быть освобождено, хотя вы не можете освобождать вещи по отдельности.

-1
ответ дан 30 November 2019 в 14:12
поделиться

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

Я хотел бы добавить один трюк, который я стараюсь держать в уме при программировании на языках с GC'd. Правило гласит: "Важно как можно быстрее отказаться от указателей". Под отбрасыванием указателей я подразумеваю, что я больше не указываю на объекты, которые я больше не буду использовать. Например, в некоторых языках это можно сделать, установив переменную в Null. Это можно рассматривать как подсказку сборщику мусора, что можно собрать этот объект, если на него нет других указателей.

0
ответ дан 30 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

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