T
PS. Можно ли записать StringMap в StringMap ?
//globals
StringMap map1 = new StringMap();
void fucn1()
{
StringMap map2 = new StringMap();
map1.SetValue("SecondMap", map2);
}
//Получить StringMap из StringMap
void func2()
{
StringMap tempMap
int value;
map1.GetValue("SecondMap", value);
tempMap = view_as<StringMap>(value);
//something...
//p.s если сделать delete на этот StringMap, то получить его будет невозможно уже из StringMap
}
первый раз вижу такую запись, помогите понять как она работает))PHP:tempMap = view_as<StringMap>(value);
мы заставляем компилятор считать, что value (тип инт) это тип StringMap.первый раз вижу такую запись, помогите понять как она работает))
скажите пожалуйста при таком подходе если я будут часто использовать создание переменной типа StringMap tempMap и извлечения в нее данных tempMap = view_as<StringMap>(value); - будет ли утечка памяти? Данные по сути содержатся в StringMap map1, но когда я их достаю я же создаю дополнительный "временный" StringMap tempMap а после чего не могу делать delete tempMap т.к мне эти данные нужны. Если я выйду из функции func2() будет ли утечка?PHP://globals StringMap map1 = new StringMap(); void fucn1() { StringMap map2 = new StringMap(); map1.SetValue("SecondMap", map2); } //Получить StringMap из StringMap void func2() { StringMap tempMap int value; map1.GetValue("SecondMap", value); tempMap = view_as<StringMap>(value); //something... //p.s если сделать delete на этот StringMap, то получить его будет невозможно уже из StringMap }
спасибо большое, а то у меня где-то утечка теперь исправляю везде))Не будет.
Прочитайте переведенный гайд [SourcePawn] Пара слов о типе переменных Handle -> Handles (SourceMod Scripting)//Тут нужно делать CloseHandle(trie); ?
delete GlobalStrMap; //или это само очистит память от trie?
Так же и в другой теме Утечка памяти STringMap в StringMap (и другие вопросы)C-подобный:StringMap tempMap int value; map1.GetValue("SecondMap", value); tempMap = view_as<StringMap>(value);
// methodmap StringMap - второй аргумент метода GetValue имеет тип any, поэтому
// приводить к типу StringMap собственно не требуется
StringMap tempMap;
map1.GetValue("SecondMap", tempMap);
просто@DarklSide, получается я должен перед delete GlobalStrMap; пройтись в цикле по всем его ключам получить их Handle trie и сделать на каждый CloseHandle(trie); trie = null; - я правильно понял суть марали?
Не правильно, смотри документацию CreateDirectory · files · SourceMod Scripting API Reference Ф-я возвращает bool, а не хендлHandle hdL = CreateDirectory(g_sFilePath, 511);
CloseHandle(hdL);
hdL = null; //вопрос на засыпку, это делать обязательно если у меня нет никаких проверок на эту переменную?
неhdL = null; //вопрос на засыпку, это делать обязательно если у меня нет никаких проверок на эту переменную?
Handle g_Zones = INVALID_HANDLE;
Handle cvar_timer = INVALID_HANDLE;
public void OnPluginStart()
{
cvar_timer = CreateTimer(checker, BeamBoxAll, _, TIMER_REPEAT);
}
public Action BeamBoxAll(Handle timer, any data)
{
int size = GetArraySize(g_Zones);
float posA[3];
float posB[3];
int zColor[4];
int Team;
int Vis;
char nombre[64];
for (int i = 0; i < size; ++i)
{
Handle trie = GetArrayCell(g_Zones, i);
GetTrieArray(trie, "corda", posA, sizeof(posA));
GetTrieArray(trie, "cordb", posB, sizeof(posB));
GetTrieValue(trie, "team", Team);
GetTrieValue(trie, "vis", Vis);
GetTrieString(trie, "name", nombre, 64);
//CloseHandle(trie);
....
....
....
...
}
return Plugin_Continue;
}
Полностью. Если он сделаетОн в цикле+таймере повторяющимся долбит Handle trie = GetArrayCell(g_Zones, i); и как видно не делает CloseHandle(trie); - на сколько это корректно?
CloseHandle()
- элемент в самом массиве станет невалидным. Хендл не будет равняться null
, но будет невалидным, и при очередном прогоне словит ошибку Invalid handle
.