Всех приветствую. Возник такой вопрос. При создании одной занятной системы, связанной с хэш-таблицей, при постоянном использовании функции с конструкцией возникает выделение памяти, доходящее до предела и выбивает вар. Привожу часть кода, который вызывает сомнения:
}elseif GetHandleId(LoadUnitHandle(table,parentKey,childKey) > 0){
	return UNIT_STR
}elseif ..
Пояснения, зачем и как это работает: позволяет определить тип переменной, сохраненной в конкретной ячейке хэш-таблицы (помогает при debag'е), но память все же выделяется, что быть не должно. Как с этим бороться?
P.S.: я знаю, хэш-таблицы - зло, но все же мне нравится их использовать.

Принятый ответ

MultiboardGetItem создает игровой объект-ячейку, MultiboardReleaseItem разбивает её обратно. Если таблица навсегда. то выгоднее хранить объекты в массиве, чтобы не терять время на постоянные Get-Release + это позволяет в дальнейшем асинхронно менять содержимое ячеек, что невозможно, если использовать функции.
Ну а кто жрет память, моешь с помощью этой тулзы глянуть (может не запускаться, у меня работает) - кинуть в корень варика и запустить при работающей игре
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
20
6 лет назад
0
Если UNIT_STR не является уникальной генерируемой строкой, то в этом фрагменте кода нечего бояться, поскольку осуществляется только чтение из ХТ. По крайней мере, так подсказывает здравый смысл
0
13
6 лет назад
Отредактирован Пушистый
0
Diaboliko, строки с типизацией объявлены через дефайн. Может, в этом проблема?
define{
	...
    DESTRUCTABLE_STR = "destructable"
    ITEM_STR = "item"
    UNIT_STR = "unit"
    ABILITY_STR = "ability"
	...
}
4
28
6 лет назад
4
Пушистый, проблемы не в дефайне
лично меня в твоём коде смущают скобки
а именно отсутствие закрывающей скобки
0
13
6 лет назад
Отредактирован Пушистый
0
nvc123, просто навел часть из перебора по 40+ типам. Там суть одинакова. Все равно грузит память (пробовал заменить дефайн на константы). Такой перебор нужен, чтобы конкретизировать handle.
0
32
6 лет назад
0
Ты случаем не плодишь строки?
Тип string в JASS это хендл из таблицы строк, туда попадает все, по осторожнее со строками.
0
13
6 лет назад
Отредактирован Пушистый
0
quq_CCCP, со строками есть такое. Типы в ячейках транслирую по мультиборду:
MultiboardSetItemValue(mbi,GetSavedValueTypeStrAdv(SYSTEM_HASHTABLE,HashtableUtils_ParentKey,childKey))
Функция, которая в этом действии возвращает строку - название типа после перебора. Если интересно - могу прикрепить карту.
Был вариант выводить числа, но все равно тогда приходится применять I2S, что опять дает строку.
0
32
6 лет назад
0
Мб из иконок сделать типы раз строками засирается память при юзе твой системы с мультмбордами?
Карту кинь, потом гляну... Мб еще лич заинтересуется.
0
13
6 лет назад
0
quq_CCCP, вот, извиняюсь за примитивность, конечно. Идея с картинками хороша, нужно будет попробовать.
Загруженные файлы
0
28
6 лет назад
0
Пушистый, в том коде что ты кидал строки не утекают
они хэшируются как и любые строки
мб ты затираешь значения в таблице?
например сохранил юнита в ячейку 1-1 а потом в эту же ячейку точку
в результате юнит в игре остался а в таблице нет
6
16
6 лет назад
6
хт не зло, а настоящий дар свыше
у тебя везде MultiboardGetItem, а кто будет MultiboardReleaseItem делать?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.