XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Method

offline
Опыт: 152
Активность:
Утечки
Здравствуйте!
Вот копаясь в коде увидел следующее
   call CreateItem('CODE',x,y)
Нативка просто вызывается. Но у меня возник вопрос - дает ли такое использование утечку?
Ведь нативка сама по себе возвращает Item (предмет):
  native CreateItem takes integer itemid, real x, real y returns item
Тоже самое можно и сказать про нативе-функцию CreateUnit:
  native CreateUnit takes player id, integer unitid, real x, real y, real face returns unit
Объясните что к чему начинающему Jass user
Старый 02.03.2011, 23:04
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,681
Активность:
Конечно даёт.
Старый 02.03.2011, 23:22
Nekit1234007

offline
Опыт: 11,916
Активность:
Почему это? Тупо создаётся где-то предмет, как если бы его купили. Можно поднять/бросить/использовать/убить без последствий. Не утечка. При правильном использовании, конечно.
Старый 02.03.2011, 23:27
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,681
Активность:
Например, юниты, расставленные в редакторе, создаются как-то так:
local unit u

set u = CreateUnit(...
set u = CreateUnit(...
...
set u = ...

set u = null
Зачем? Хэндл получил - забери.
Старый 02.03.2011, 23:47
Nekit1234007

offline
Опыт: 11,916
Активность:
Мне кажется это сделано для доп. действий с ними. Футман с 5% хп поставленный в редакторе и с активной способнстью укрыться за щитом и пара просто пизантов:
function CreateUnitsForPlayer0 takes nothing returns nothing
local player p=Player(0)
local unit u
local integer unitID
local trigger t
local real life
set u=CreateUnit(p,0x68666F6F,-79.8,87.7,311.290)
set life=GetUnitState(u,UNIT_STATE_LIFE)
call SetUnitState(u,UNIT_STATE_LIFE,0.05*life)
call IssueImmediateOrder(u,"defend")
set u=CreateUnit(p,0x68706561,39.3,38.5,18.315)
set u=CreateUnit(p,0x68706561,-154.0,-44.0,278.940
// Код не менял. Как видно «u» не обнуляется, thx blizz
endfunction
А в ситуациях без доп. действий близзы схалтурили и оставили как есть. Мне думается так.
Старый 03.03.2011, 00:05
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Все что возвращает хендл\агент создает утечки если не обнулить.
Старый 03.03.2011, 00:42
Method

offline
Опыт: 152
Активность:
Подведем итоги, господа.
Если ответ Faion'a действительно наполнен до краев правдой(в чем я уверен), то суть дальнейшего сущевствования этой темы в открытом виде в еденицах стремится к нулю.
Спасибо за внимание
Старый 03.03.2011, 00:51
reALien

offline
Опыт: 29,211
Активность:
Странная у вас логика)
Утечка была бы если бы мы что-то создавали временно и не удаляли или сохраняли хендл на что-то, что-то уничтожалось а хендл не стирался.
Здесь же просто создается объект, у которого уже есть хендл, сидящий в памяти, не быть не может, функция нам его сообщает, но в память то не пишет же больше данных никаких, откуда утечке то взятся
Если не так, то доказующие обратное тесты в студию)
Старый 03.03.2011, 01:16
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
созданный юнит - это не утечка, а return как минимум "закрывает" переменную, не создавая утечки. В примере Nekit1234007 утечка есть, т.к. переменная u не обнуляется или не возвращается через return.
function Create_Unit takes player p, integer unitID, real x, real y, real r returns nothing
    local unit u
    call CreateUnit(p,unitID,x,y,r) // вариант 1
    set u = CreateUnit(p,unitID,x,y,r) // вариант 2
    set u = null
endfunction
Если вы не сохраните созданного юнита в переменную, то утечки не возникнет, но вы не получите ссылку на него, чтобы использовать его в других функциях, как видно на первом варианте.
Если вы сохранили юнита в переменную, то после использования переменной, ее нужно обнулить, иначе именно тут и будет возникать утечка.
Старый 03.03.2011, 02:57
Doc

offline
Опыт: 63,163
Активность:
Зачем хранить ссылку на предмет, если тебе нужно просто отдать его игроку?
Спасибо за внимание
Старый 06.03.2011, 21:31
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 01:55.