Как удалить экземпляр класса js
Перейти к содержимому

Как удалить экземпляр класса js

  • автор:

Курсы javascript

Если очень хочется то testClassObj = null;
Самоудалиться ты не сможешь, можешь разве что подчистить все свойства и методы оставив пустой объект.

__________________
08.09.2014, 11:10
Интересующийся
Регистрация: 05.08.2014
Сообщений: 16

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

08.09.2014, 11:18
Регистрация: 12.12.2012
Сообщений: 1,398

Straj,
Объект удаляется когда на него нет ссылок. Если к объекту нельзя получить доступ — сборщик сожрет его.

08.09.2014, 11:30
Регистрация: 02.01.2010
Сообщений: 6,455

Как верно заметил tsigel, главное — не оставлять ссылок. В ручную за исключением редких конкретных случаев удалять смысла нет. Функция закончит работу и объект исчезнет.
(Правда не в приведённом вами куске кода, ибо в нём testClassObj объявлен без var т.е. в глобальной области видимости)

Как удалить экземпляр класса java

Но можно установить этот экземпляр класса в значение null , чтобы позволить сборщику мусора удалить объект, на который ссылается переменная.

// создание объекта класса MyClass MyClass myObj = new MyClass(); // удаление ссылки на объект myObj = null; 

В этом примере переменная myObj ссылается на объект класса MyClass . После установки значения null переменная больше не ссылается на объект, что позволяет сборщику мусора удалить объект.

Как уничтожить экземпляр класса (объект)?

Я столкнул с такой проблемой. Я не могу понять как удалять объекты класса(экземляры). Читая интернет я вижу что «мусорщик» должен автоматически удалять те объекты, на которые нет указателя, но у меня это не работает. Подскажите как решить. Вот видео где всё показано, по нажатию кнопки в указатель записывается новый объект, но старый не удаляется, это видно по увеличению кол-ва оперативной памяти занимаемого приложением.

Кликните здесь для просмотра всего текста
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как в случае с Dependency Injection внедрять отдельный экземпляр некоторого класса только лишь для одного другого класса
Здравствуйте, пытаюсь понять как же всё таки правильно использовать Dependency Injection в случае c.

Как создать экземпляр класса по условию
Доброго времени суток. Нужна помощь в решении следующей задачи: Исходные данные Имеется решение.

Как создать экземпляр класса библиотеки
есть сервер создаю прослушку ChannelServices.RegisterChannel(new HttpChannel(60000)); .

Эксперт .NET

5869 / 4746 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361

ЦитатаСообщение от Roman Pytkov Посмотреть сообщение

«мусорщик» должен автоматически удалять те объекты, на которые нет указателя

Должен. И удаляет. Причем даже автоматически. Но не сразу после потери ссылки на объект, а позже. Через неопределенный промежуток времени.
И, не знаю, как у других, но у меня видео не открывается.

Эксперт .NET

6451 / 3980 / 1587
Регистрация: 09.05.2015
Сообщений: 9,339

ЦитатаСообщение от Даценд Посмотреть сообщение

но у меня видео не открывается
Встроенное не открывается, а если ссылку над ним нажать то открывается.
Регистрация: 11.03.2019
Сообщений: 42

извиняюсь, видимо я не понял что нужно ввести между [YOUTUBE] и впихнул ссылку

Добавлено через 23 секунды
Тоесть по этому поводу нет смысла беспокоиться и он всё равно удалит когда нужно будет?

Добавлено через 1 час 22 минуты

вот видео, я разобрался как вставлять его

Эксперт .NET

4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

ЦитатаСообщение от Roman Pytkov Посмотреть сообщение

Тоесть по этому поводу нет смысла беспокоиться и он всё равно удалит когда нужно будет?

Да. Только стоит беспокоиться о том, чтобы на объект не было других ссылок.

ЦитатаСообщение от Roman Pytkov Посмотреть сообщение

Читая интернет я вижу что «мусорщик» должен
Павильно по-русски — Сборщик мусора
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,399

ЦитатаСообщение от Roman Pytkov Посмотреть сообщение

Читая интернет я вижу что «мусорщик» должен автоматически удалять те объекты, на которые нет указателя, но у меня это не работает.

Мусорщик не управляет временем жизни объектов от слова совсем. Он управляет буферами памяти занимаемыми объектами. Поэтому если нужно принудительно разрушить объект то пишите для этого специальный метод который высвобождает ресурсы и т.д.(по конвенции он называется Dispose) и вызываете его ручками. Никакой годной для ООП автоматики полностью устаревший к концу 60-х GC не дает и дать не способен в принципе. Поэтому из всех профессиональных потомков симулы-67 его выбросили еще к 80-ым.

652 / 587 / 171
Регистрация: 17.07.2012
Сообщений: 1,667
Записей в блоге: 1

Fulcrum_013, вы так умно завернули, что аж спорить с вами страшно

А финализаторы он тоже у буферов памяти вызывает? Еще, очень бы хотелось поглядеть на реализацию Dispose(), которая принудительно разрушает объект.

309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
Roman Pytkov, вот вам пример:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; namespace Rextester { public class Program { class MyObject { byte[] buff = new byte[1024]; } public static void Main(string[] args) { const bool keep_references = false; const int number_of_objects = 1000*1000; if(keep_references) { ListMyObject> references = new ListMyObject>(number_of_objects); for(int i = 0; inumber_of_objects; ++i) { // Сохраняем ссылку на объект, поэтому GC его не удалит references.Add(new MyObject()); } } else { MyObject only_ref; for(int i = 0; inumber_of_objects; ++i) { // Затираем старую ссылку, поэтому старые объекты будут удаляться only_ref = new MyObject(); } } } } }

Если поставите keep_references как true, память не будет очищаться, а если поставите false, то GC периодически будет чистить.

Эксперт .NET

11809 / 8130 / 1241
Регистрация: 21.01.2016
Сообщений: 30,601

ЦитатаСообщение от Fulcrum_013 Посмотреть сообщение

оэтому если нужно принудительно разрушить объект то пишите для этого специальный метод который высвобождает ресурсы и т.д.(по конвенции он называется Dispose)

Можете показать пример метода, который принудительно разрушает объект в C#?
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,399

Usaga, Читайте доку по Dispose.

Добавлено через 1 минуту
Usaga, https://docs.microsoft.com/en-. ng-dispose
Вас где забанили то? На гугле или на MSDN? Или и там и там?

168 / 386 / 12
Регистрация: 21.06.2019
Сообщений: 2,329

Fulcrum_013, Dispose не разрушает объект, он только должен освобождать занятые им ресурсы. Сам объект удаляется только сборщиком мусора.

Эксперт .NET

11809 / 8130 / 1241
Регистрация: 21.01.2016
Сообщений: 30,601
Fulcrum_013, ткните меня носом в доку, где сказано, что Dispose разрушает объект.
3298 / 2339 / 665
Регистрация: 02.08.2011
Сообщений: 6,401

Usaga, под разрушением объекта и подразумевается освобождение используемых им ресурсов, то есть вызов Dispose.
Где-то в литературе, кажется у Теплякова, есть понятие частично разрушенного объекта — когда Dispose вызван, но коллектором сам объект еще не собран.

2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,399

Usaga, Уже ткнули. Что вы подразумеваете под уничтожением объекта то? И самое главное что подразумеваете под термином «объект». это кстати и причина всех путаниц. на русский и Instance и object переводят как объект. А это две огромные разницы. вот именно уничтожением instanсe (экземпляра класса) Dispose и занимается.

652 / 587 / 171
Регистрация: 17.07.2012
Сообщений: 1,667
Записей в блоге: 1

Fulcrum_013, Dispose() никакими уничтожениями инстансов не занимается, сборщиком мусора не обрабатывается и память не очищает. Он нужен лишь для того, чтобы программист мог сам освободить unmanaged ресурсы, дабы освободить объект от финализации, которая есть достаточно ресурсоемкий процесс.

Эксперт .NET

11809 / 8130 / 1241
Регистрация: 21.01.2016
Сообщений: 30,601

Fulcrum_013, под уничтожением объекта подразумевается уничтожение самого экземпляра класса и высвобождение занимаемой им памяти. Теперь ткните меня носом в документацию, где говорится, что метод Dispose этим занмиается.

2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,399

ЦитатаСообщение от Usaga Посмотреть сообщение

под уничтожением объекта подразумевается уничтожение самого экземпляра класса и высвобождение занимаемой им памяти.

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

Добавлено через 6 минут
Поэтому и занимаются ими разные элементы. Уничтожением экземпляра — Dispose в манаджед языках и деструктор в нативных. А уничтожением буфера (возвратом его менеджеру памяти) занимается operator delete или GC. При этом время жизни инстанса и занимаемого им буфера в общем случае вооще никак не взаимосвязано. В том же векторе буфер удаленного инстанса переиспользуется для размещения другого инстанса без возврата менеджеру памяти, т.е. буфер живет дольше инстанса. А к примеру при расширении вектора инстансы переселяются в другой буфер а старый возвращается менеджеру памяти. т.е. инстансы живут дольше буфера.

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

delete

где результат вычисления выражения должен быть ссылкой на свойство (объекта), например:

delete object.property delete object['property'] delete object[index] delete property // удаляет свойства глобального объекта, или, // используя инструкцию with, свойства объекта, на который ссылается инструкция

Если результат вычисления выражения не является свойством (объекта), delete ничего не делает.

Параметры

Имя объекта или выражение, результатом вычисления которого является объект.

Целое число, представляющее собой индекс массива, который должен быть удалён.

Возвращаемое значение

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

Описание

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

delete эффективен только применительно к свойствам объектов. Он не оказывает никакого влияния на имена переменных и функций. Присвоение значения свойству без указания объекта (без оператора var) иногда неверно характеризуется, как глобальная переменная, (например x = 5 ). На самом деле происходит присвоение значения свойству глобального объекта.

delete не может удалить определённые свойства встроенных объектов (таких как Object, Array, Math и так далее). В спецификации ECMA-262 они обозначены как DontDelete.

= 42; // создаёт свойство x в глобальном объекте var y = 43; // объявляет новую переменную, y myobj = >; myobj.h = 4; // создаёт свойство h в myobj myobj.k = 5; // создаёт свойство k в myobj delete x; // возвращает true (x - свойство глобального объекта и может быть удалено) delete y; // возвращает false (delete не влияет на имена переменных) delete Math.PI; // возвращает false (delete не влияет на определённые встроенные свойства) delete myobj.h; // возвращает true (свойства, определённые пользователем могут быть удалены) with (myobj)  delete k; // возвращает true (эквивалентно delete myobj.k) > delete myobj; // возвращает true (myobj это свойство глобального объекта, не переменная, поэтому может быть удалено) 

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

function Foo() > Foo.prototype.bar = 42; var foo = new Foo(); delete foo.bar; // возвращает true, но безрезультатно, так как bar - наследуемое свойство alert(foo.bar); // выводит 42, свойство все ещё наследуется delete Foo.prototype.bar; // удаляет свойство из прототипа alert(foo.bar); // выводит "undefined", свойство больше не наследуется 

Удаление элементов массива

Когда с помощью оператора delete удаляется элемент массива, длина массива не меняется. Например, если вы удалите a[3] , a[4] по прежнему a[4] , а a[3] не определено. Так будет даже если вы удалите последний элемент массива ( delete a[a.length-1] ).

Когда оператор delete удаляет элемент массива, этот элемент больше не существует в массиве. В следующем примере, trees[3] удаляется с помощью delete .

const trees = ["redwood", "bay", "cedar", "oak", "maple"]; delete trees[3]; console.log(3 in trees); // false 

Если вы хотите, чтобы элемент массива существовал, но имел значение undefined, используйте значение undefined вместо оператора delete . В следующем примере, trees[3] принимает значение undefined, но элемент массива все ещё существует:

const trees = ["redwood", "bay", "cedar", "oak", "maple"]; trees[3] = undefined; console.log(3 in trees); // true 

Проблема кроссбраузерности

Несмотря на то, что стандарт ECMAScript оставляет порядок итерации по свойствам объектов на усмотрение реализующей стороны, может оказаться так, что все основные браузеры поддерживают порядок итерации, основанный на принципе «свойство добавленное в объект раньше идёт раньше» (по крайней мере для свойств не находящихся в прототипе). Однако, в случае с Internet Explorer, когда кто-нибудь использует delete с каким-либо свойством, это приводит к некоторым неожиданным результатам, заставляя другие браузеры отказаться от использования простых объектов, таких как литералы объектов, в качестве ассоциативных массивов. В Internet Explorer, когда значение свойства установлено в undefined, после удаления этого свойства, если кто-нибудь позже добавит свойство с таким же именем, оно окажется в своей старой позиции, а не в конце итерационной последовательности, как ожидается.

Поэтому, если вы хотите симулировать упорядоченный ассоциативный массив в кроссбраузерной среде, вам придётся либо использовать два отдельных массива (один для ключей и один для значений), либо построить массив из объектов с одним свойством и так далее.

Внешние ссылки

  • Глубокий анализ оператора delete

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *