StringMap и динамические элементы.

T

Tolyan

StringMap - по сути гибкий динамический массив.

Нужно записать в КАЖДУЮ ячейку N количество строк, При чем N != const (может быть 2, а может быт 100 строк)

Нужно создать динамический массив внутри динамического массива StringMap . Помогите примером.

PS. Можно ли записать StringMap в StringMap ?
 

FurFur

Участник
Сообщения
153
Реакции
85
PS. Можно ли записать StringMap в StringMap ?

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
}
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #4
@Tolyan, значение переменной это просто набор битов (для всех типов в павне - 32 бита = 4 байта)
т.е. это просто 01101010 01101010 01101010 01101010.
Для каждой переменной хранится её тип, чтобы виртуальная машина знала с чем она работает.
Например число написанное выше, если имеет тип float то равно одному значению (скажем 15674687.65, это просто случайное число, но будем считать что это именно так), для int это будет 244879879.
Т.е. значение одно, для разных типов оно интерпретируется по разному.
В этом выражении:
первый раз вижу такую запись, помогите понять как она работает))
мы заставляем компилятор считать, что value (тип инт) это тип StringMap.
 

Banana

Участник
Сообщения
892
Реакции
113
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
}
скажите пожалуйста при таком подходе если я будут часто использовать создание переменной типа StringMap tempMap и извлечения в нее данных tempMap = view_as<StringMap>(value); - будет ли утечка памяти? Данные по сути содержатся в StringMap map1, но когда я их достаю я же создаю дополнительный "временный" StringMap tempMap а после чего не могу делать delete tempMap т.к мне эти данные нужны. Если я выйду из функции func2() будет ли утечка?
Сообщения автоматически склеены:

@R1KO, загляните пожалуйста если есть минутка )
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #6
когда я их достаю я же создаю дополнительный "временный" StringMap tempMap а после чего не могу делать delete tempMap т.к мне эти данные нужны. Если я выйду из функции func2() будет ли утечка?
Не будет.
 

Banana

Участник
Сообщения
892
Реакции
113
спасибо большое, а то у меня где-то утечка теперь исправляю везде))

Позвольте вам еще 1 вопрос

Handle trie = CreateTrie();
GlobalStrMap.SetValue(num, trie);

//CreateTrie() - Требует CloseHandle(trie); согласно API, если я это делаю то таким образом очищаю запись в GlobalStrMap что для меня не подходит..
Потом мне нужно сделать delete GlobalStrMap; - делая это старые данные CreateTrie(); (которые были переданы) в уже удаленный GlobalStrMap, тоже будут удалены или мне нужно будет запускать цикл по всем ключам GlobalStrMap и удалять каждый CreateTrie() через CloseHandle(trie); и только потом делать delete GlobalStrMap;?
Сообщения автоматически склеены:

===========================================================

Handle trie = CreateTrie();
GlobalStrMap.SetValue(num, trie);

.....

//Тут нужно делать CloseHandle(trie); ?
delete GlobalStrMap; //или это само очистит память от trie?
 
Последнее редактирование:

DarklSide

Участник
Сообщения
931
Реакции
468
//Тут нужно делать CloseHandle(trie); ?
delete GlobalStrMap; //или это само очистит память от trie?
Прочитайте переведенный гайд [SourcePawn] Пара слов о типе переменных Handle -> Handles (SourceMod Scripting)
В нем не прямым текстом дан ответ.

C-подобный:
StringMap tempMap
int value;
map1.GetValue("SecondMap", value);
tempMap = view_as<StringMap>(value);
Так же и в другой теме Утечка памяти STringMap в StringMap (и другие вопросы)

C-подобный:
// methodmap StringMap - второй аргумент метода GetValue имеет тип any, поэтому
// приводить к типу StringMap собственно не требуется
StringMap tempMap;
map1.GetValue("SecondMap", tempMap);
 

Banana

Участник
Сообщения
892
Реакции
113
@DarklSide, получается я должен перед delete GlobalStrMap; пройтись в цикле по всем его ключам получить их Handle trie и сделать на каждый CloseHandle(trie); trie = null; - я правильно понял суть марали?

CreateDirectory(g_sFilePath, 511); - я еще использую функцию эту просто без присваивания ей переменной, это тоже не правильно? тут тоже нужно делать так?:

Handle hdL = CreateDirectory(g_sFilePath, 511);
CloseHandle(hdL);
hdL = null; //вопрос на засыпку, это делать обязательно если у меня нет никаких проверок на эту переменную?
Сообщения автоматически склеены:

Я вот делаю какие-то выводы но я в них не уверен пока мне кто нибудь авторитетный не напишет конкретный ответ)
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
@DarklSide, получается я должен перед delete GlobalStrMap; пройтись в цикле по всем его ключам получить их Handle trie и сделать на каждый CloseHandle(trie); trie = null; - я правильно понял суть марали?
просто
CloseHandle(trie);
Handle hdL = CreateDirectory(g_sFilePath, 511);
CloseHandle(hdL);
hdL = null; //вопрос на засыпку, это делать обязательно если у меня нет никаких проверок на эту переменную?
Не правильно, смотри документацию CreateDirectory · files · SourceMod Scripting API Reference Ф-я возвращает bool, а не хендл

hdL = null; //вопрос на засыпку, это делать обязательно если у меня нет никаких проверок на эту переменную?
не
 

Banana

Участник
Сообщения
892
Реакции
113
@R1KO, значит я понял все на 100% правильно, где у меня были сомнения я уточнил и вы мне их развеяли. Спасибо всем кто помогал разобраться в этом вопросе, чую что у меня еще будут пару вопросов в процессе исправления утечек )
Сообщения автоматически склеены:

Я тут разбираю плагин devzones который написал Franc1sco , вроде бы далеко не глупый. - [Any] Dev Zones (with natives for developers) [Updated 8-Jun-2020] - AlliedModders и не пойму мне кажется или там реально много утечек?

В исходнике у его закомментированы //CloseHandle(trie);, теперь я не могу понять оно там действительно не нужно или он в 2010 не мог написать плагин без утечек? Там 4 таких //CloseHandle(trie);

Прикреплю маленький отрезок где мне кажется что это утечка а вы скажите тут она есть или нет и обьясните почему?:
PHP:
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); - на сколько это корректно?
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #12
Он в цикле+таймере повторяющимся долбит Handle trie = GetArrayCell(g_Zones, i); и как видно не делает CloseHandle(trie); - на сколько это корректно?
Полностью. Если он сделает CloseHandle() - элемент в самом массиве станет невалидным. Хендл не будет равняться null, но будет невалидным, и при очередном прогоне словит ошибку Invalid handle.
 

Banana

Участник
Сообщения
892
Реакции
113
Крч утечка памяти мне нервов потрепала по этому я и вижу ее теперь везде))) Спасибо
 
Сверху Снизу