N1kS Posted August 27, 2015 Share Posted August 27, 2015 Доброго времени суток, специально создал отдельную тему, т.к общался со многими компетентными(на мой взгляд) людьми, гуглил и никто так и не помог устранить проблемы. Объясню по этапам. Появилась необходимость сделать кастомное GUI, делаю с помощью ООП(так называемого) используя либу: http://pastebin.com/RC1gN4Bs. Сразу же прикреплю код: http://pastebin.com/2dQat3RK Ниже суть проблемы вместе со скриншотами. Название ресурса - DxDrawing 1) Ресурс запущен, ничего не производилось, никаких действий. http://i.imgur.com/06n0wz7.png 2) Создано 10000 объектов. http://i.imgur.com/1iMutGF.png 3) Объекты удалены (по идее) http://i.imgur.com/oxbWco4.png Думаю видно, что занимаемая память на первом и последнем скринах не соответствует. Возможно я что-то делаю не так, возможно эта проблема глобальнее. Хотелось бы услышать адекватный ответ или же совет. P.S. советы вроде "НЕ ИСПОЛЬЗУЙ ООП" попрошу в теме не оставлять. Link to comment
Elengar Posted August 27, 2015 Share Posted August 27, 2015 Попробуй поискать документацию на collectgarbage() и использовать ее. Link to comment
N1kS Posted August 27, 2015 Author Share Posted August 27, 2015 Было бы неплохо, если бы вы посмотрели код внимательнее. Если в collectgarbage не использовать никакого аргумента, то он по стандарту использует "collect", внимание на строку 42 в коде. Link to comment
lil Toady Posted August 31, 2015 Share Posted August 31, 2015 Особо не вчитывался, но v:Destroy() может и выполняет какие-то действия, сам Lua объект/таблицу она удалить не может, соответственно таблица EditField все еще полна и коллектор не подберет то что в ней находится. Распространенная ошибка когда скрипты сохраняют юзеров или какие еще элементы в глобальной таблице, юзеры уходят с сервера или элементы удаляются, а таблицу никто не чистит. Link to comment
N1kS Posted August 31, 2015 Author Share Posted August 31, 2015 По сути после v:Destroy() в таблице EditField каждый элемент - nil (проверял, выводил), тобишь имеем таблицу, в которой 10000 элементов nil, но после вызова коллектора память не очищается. Скрипт клиентский, ссылок на объекты, хранение в каких то других таблицах нет. Link to comment
TheNormalnij Posted September 1, 2015 Share Posted September 1, 2015 Почему-то казалось, что self = nil не должна убивать таблицу в EditField. Я раньше имел дело с этим Link to comment
lil Toady Posted September 1, 2015 Share Posted September 1, 2015 Да не работает так Lua. Объект не может обнулить/удалить сам себя, а соответственно и все ссылки на себя. function CEditField:Destroy() это лишь короткая запись для function CEditField.Destroy( self ) или CEditField.Destroy = function ( self ) все эти записи будут работать абсолютно одинаково, соответственно self = nil это лишь обнуление локальной переменной, что не делает ровным счетом ничего. self - не магия, а локальная переменная которая передается в функцию. Вот эти 2 записи тоже делают абсолютно одно и то же: v:Destroy() CEditField.Destroy ( v ) Чисти таблицу. В ней не могут быть значения nil: либо есть значение, либо его нет. А вот метаметоды __tostring и иже с ними могут запутать. Для примера, если записать в таблицу игрока, когда он выйдет с сервера, он все еще останется в таблице и tostring все еще будет говорить что у нас на руках userdata, не смотря на то что МТА его удалила. Просто потому что невозможно удалить все ссылки на этого игрока удалив его самого. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now