Java

509
2
Изучаю OpenGL на яве. И вот думаю,я забыла про деструкторы! Они в Java есть? Что-то упустила этот момент:blush:
 
1,990
18
105
Нет, они там не нужны. В менеджмент памяти в Java лучше не лезть, GC делает свою работу. Единственное, есть такой метод - finalize, он вызывается garbage collector'ом перед удалении объекта из памяти, т.е. когда не остается на него указателей. Если хочешь превратить свой код в костыль, который будет всё тормозить - пожалуйста. А так применения этой функции я нигде ещё не видел. Дело в том, что GC может удалить твой объект в любое время, ибо чистит он не сразу после исчезновения всех указателей. А может быть такое, что где-то случайно останется указатель на объект и он никогда не удалится.
Короче в книжках его люто не советуют, хотя я толком ни одной и не прочитал, так, мимо читал нужные доки и статейки разные.
Единственное его применение: чистить заюзанные внешние (системные) ресурсы. Хотя это не делает его стабильным и хорошим методом (даже в данном случае) для очистки ресурсов. В нужный момент он может не вызваться и прощай память.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Я один не в курсе, что такое деструкторы?
 
1,990
18
105
Привет С++. Там можно вручную выделять память объектам через оператор new - но её обязательно придется чистить потом, обычно это делается в деструкторе. Полная противоположность конструктора.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Oldestkon написал(а):
Полная противоположность конструктора.
Вот, отличное объяснение xD
Только что читал статью, "Java делает всякое такое за вас, поэтому она проще, но в C++ у вас больше контроля над памятью(что позволяет быть мощнее), так что если вы не знаете, что вы делаете, то рекомендую Java".
 
905
5
Java думает за вас.
Поэтому, собственно, Hello World и съедает 100 мб памяти.
 
509
2
anti344 написал(а):
Oldestkon написал(а):
Полная противоположность конструктора.
Вот, отличное объяснение xD
Только что читал статью, "Java делает всякое такое за вас, поэтому она проще, но в C++ у вас больше контроля над памятью(что позволяет быть мощнее), так что если вы не знаете, что вы делаете, то рекомендую Java".
Ну попробую я объяснить. Есть объект класса, вот он собрался,там цвет,имя и т.д.,всё вот объект на этом куске кода не понадобиться. Память занята этим объектом. Тут появляется деструктор.  объект уничтожается.
Более легче: Ты собрал крипера из лего, тебе он надоел, место занимает. Вот ты и разбираешь.
 
Деструктор пришел к нам из лесов C, которые растут быстрее, чем Java, и в которых нет GC-лесников.

В Java выделение памяти происходит при создании объекта по obj = new Object(), после чего использованный и ненужный объект можно просто "забыть", потерев укзатели на него, obj = null или obj = new Object() (и в этом случае старый тоже потеряется). Через некоторое время GC доберется до него, обработает ссылки внутри, как нерабочие и удалит объект.

В C выделять память можно двумя способами:
1) локально (из стека, живет, как и в Java, до конца блока кода): object = Object()
2) из heap'а ОС:
2A) для объектов через *obj = new Object()
2B) "на будущее": *mem = malloc(bytes), *mem = malloc(count, bytes)
После выделения из heap'а уже не нужную память обязательно нужно вернуть обратно в heap ОС (освободить) - 2A) delete obj и 2B) free(mem). Иначе будет происходить утечка памяти (memory leak), растущая с каждым объектом, "унесшим память с собой в могилу", что приведет к своего рода OutOfMemory. Для этого и существует деструктор - если в конструкторе некий объект занимает память, ему придется ее вернуть в хип. Но объекты имеют привычку умирать в самых неожиданных местах кода, так и не освободив память. Именно поэтому деструктор гарантированно вызывается при смерти объекта.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Skarlet написал(а):
anti344 написал(а):
Oldestkon написал(а):
Полная противоположность конструктора.
Вот, отличное объяснение xD
Только что читал статью, "Java делает всякое такое за вас, поэтому она проще, но в C++ у вас больше контроля над памятью(что позволяет быть мощнее), так что если вы не знаете, что вы делаете, то рекомендую Java".
Ну попробую я объяснить. Есть объект класса, вот он собрался,там цвет,имя и т.д.,всё вот объект на этом куске кода не понадобиться. Память занята этим объектом. Тут появляется деструктор.  объект уничтожается.
Более легче: Ты собрал крипера из лего, тебе он надоел, место занимает. Вот ты и разбираешь.
Да понял я, я же не RaVeN
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
mrEDitor написал(а):
Деструктор пришел к нам из лесов C, которые растут быстрее, чем Java, и в которых нет GC-лесников.

В Java выделение памяти происходит при создании объекта по obj = new Object(), после чего использованный и ненужный объект можно просто "забыть", потерев укзатели на него, obj = null или obj = new Object() (и в этом случае старый тоже потеряется). Через некоторое время GC доберется до него, обработает ссылки внутри, как нерабочие и удалит объект.

В C выделять память можно двумя способами:
1) локально (из стека, живет, как и в Java, до конца блока кода): object = Object()
2) из heap'а ОС:
2A) для объектов через *obj = new Object()
2B) "на будущее": *mem = malloc(bytes), *mem = malloc(count, bytes)
После выделения из heap'а уже не нужную память обязательно нужно вернуть обратно в heap ОС (освободить) - 2A) delete obj и 2B) free(mem). Иначе будет происходить утечка памяти (memory leak), растущая с каждым объектом, "унесшим память с собой в могилу", что приведет к своего рода OutOfMemory. Для этого и существует деструктор - если в конструкторе некий объект занимает память, ему придется ее вернуть в хип. Но объекты имеют привычку умирать в самых неожиданных местах кода, так и не освободив память. Именно поэтому деструктор гарантированно вызывается при смерти объекта.
Ну это уже подробнее, но опять-таки, я понял.
Спасибо.
 
Сверху