Будет ли утечка памяти? ArrayList + Forward

Banana

Участник
Сообщения
892
Реакции
113
Здравствуйте.

Плагин 1.
PHP:
Call_StartForward(h_Func2);
Call_PushCell(sum);
Call_PushArrayEx(hcoppyArrayList, 40, SM_PARAM_COPYBACK);
Call_Finish();

PHP:
Плагин 2.
public Func2(int sum, ArrayList temp[40])
{
    temp = hArrayList.Clone();
    return;
}

Мне нужно переписать содержимое массива из плагина 2 (hArrayList) в плагин 1 (hcoppyArrayList).

"
Метод ArrayList.Clone
Клонирует массив, возвращая новый дескриптор с тем же размером и данными. Это НЕ следует путать с CloneHandle. Это совершенно новый дескриптор с теми же данными, но без отношения к оригиналу. Он должен быть закрыт, когда больше не нужен.

"

Получается мне нужно как-то закрыть этот ArrayList temp[40] - который служит временным массивом между плагинами? Объясните как это работает.. нельзя допустить утечек.
 

NaN

FPE_INTDIV_TRAP
Сообщения
1,513
Реакции
1,487
Здравствуйте.

Плагин 1.
PHP:
Call_StartForward(h_Func2);
Call_PushCell(sum);
Call_PushArrayEx(hcoppyArrayList, 40, SM_PARAM_COPYBACK);
Call_Finish();

PHP:
Плагин 2.
public Func2(int sum, ArrayList temp[40])
{
    temp = hArrayList.Clone();
    return;
}

Мне нужно переписать содержимое массива из плагина 2 (hArrayList) в плагин 1 (hcoppyArrayList).

"
Метод ArrayList.Clone
Клонирует массив, возвращая новый дескриптор с тем же размером и данными. Это НЕ следует путать с CloneHandle. Это совершенно новый дескриптор с теми же данными, но без отношения к оригиналу. Он должен быть закрыт, когда больше не нужен.

"

Получается мне нужно как-то закрыть этот ArrayList temp[40] - который служит временным массивом между плагинами? Объясните как это работает.. нельзя допустить утечек.
думаю вот так будет правильно:

PHP:
Плагин 2.
public Func2(int sum, ArrayList temp[40])
{
    temp = hArrayList.Clone();
    CloseHandle(hArrayList);
    return;
}
 

Banana

Участник
Сообщения
892
Реакции
113
инужна помощь с передачей массива массивов из 40 элементов ...
temp = hArrayList.Clone(); - на эту строку ругается компилятор error 106: cannot call methods on an array
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Полагаю, внутри массива массивов находится массив массивов, а внутри каждого такого массива указатель на функцию со switch bool

Лучше напишите, для чего вам столько массивов. Ваше магическое число немного напрягает.
 

NaN

FPE_INTDIV_TRAP
Сообщения
1,513
Реакции
1,487

Banana

Участник
Сообщения
892
Реакции
113
for (int i = 0; i < 40; i++)
temp = hArrayList .Clone();

вот так получится передать?
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #7
for (int i = 0; i < 40; i++)
temp = hArrayList .Clone();

вот так получится передать?
забыл аргумент передать, плюс тебе потребуется также массив хендлов для temp в данном случае.
C-подобный:
ArrayList[40] temp;
for (int i = 0; i < 40; i++)
        temp[i] = hArrayList[i].Clone();

Но это все еще не лучшее решение, может лучше запихнуть все в один ArrayList? И лучше скажи зачем тебе такой костыль вообще.
 

Banana

Участник
Сообщения
892
Реакции
113
забыл аргумент передать, плюс тебе потребуется также массив хендлов для temp в данном случае.
C-подобный:
ArrayList[40] temp;
for (int i = 0; i < 40; i++)
        temp[i] = hArrayList[i] [I].Clone();

Но это все еще не лучшее решение, может лучше запихнуть все в один ArrayList? И лучше скажи зачем тебе такой костыль вообще.
Есть вопросник. Каждый элементт массива содержит в себе вопрос и несколько вариантом ответов. Всего получается 40 вопросов
Сообщения автоматически склеены:

Ну лучше я ниче не придумал и решил сделать как знаю))) однако если у вас есть какие-то более цевилизованные решения для хранения подобного рода информации то поджелитесь.
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Есть вопросник. Каждый элементт массива содержит в себе вопрос и несколько вариантом ответов. Всего получается 40 вопросов
Сообщения автоматически склеены:

Ну лучше я ниче не придумал и решил сделать как знаю))) однако если у вас есть какие-то более цевилизованные решения для хранения подобного рода информации то поджелитесь.

ArrayList:
Вопрос​
Массив с ответами​
Вопрос​
Массив с ответами​
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #11
ну у вашего решения нет очевидных преимуществ над моим))
Уверен? А память? Лучше юзать один массив и в нем хранить все данные, чем 40 массивов с хранить только, скажем, локальные данные.
 

Banana

Участник
Сообщения
892
Реакции
113
Господа помогите пожалуйста передать Массив Массивов из 40 элементов.

PHP:
Плагин 1
ArrayList hcoppyArrayList[40];
for (int k = 0; k < 40; k++)
{
    delete hcoppyArrayList[k];
     hcoppyArrayList[k] = new ArrayList(ByteCountToCells(256));
}

Call_StartForward(h_Func2);
Call_PushCell(sum);
Call_PushArrayEx(hcoppyArrayList, 40, SM_PARAM_COPYBACK);
Call_Finish();

PHP:
Плагин 2.
public Func2(int sum, ArrayList temp[40])
{
    for (int i = 0; i < 40; i++)
    {
        temp[i] = new ArrayList(ByteCountToCells(256)); 
        temp[i] = hArrayList[i].Clone(); //Invalid Handle 0 (error: 4) - ошибка на этапе исполнения
    }
return;
}
Сообщения автоматически склеены:

Уверен? А память? Лучше юзать один массив и в нем хранить все данные, чем 40 массивов с хранить только, скажем, локальные данные.
ну и сколько я килобайт сэкономлю переписывая уже рабочий и проверенный временем код? Есть разве смысл заморачиваться ?
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
ну у вашего решения нет очевидных преимуществ над моим))

Если бы не было, то и такой темы тоже не появилось бы.
Или вы хотите сказать, что это не так?
Сообщения автоматически склеены:

Мне нужно переписать содержимое массива из плагина 2 (hArrayList) в плагин 1 (hcoppyArrayList).

C-подобный:
// Основной плагин
ArrayList aExample;

// any code
public int Native_Example(Plugin hPlugin, int args)
{
    // native ArrayList nativeExample();
    return view_as<int>(aExample.Clone());
}
// -------------------------

// Остальные плагины
public void OnMapStart()
{
    // Получаем нужный нам ArrayList
    ArrayList aCopy = nativeExample();

    // any code

    // Закрываем и высвобождаем память, если не нужен
    delete aCopy;
}

Вот вам явное преимущество.
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
ну у вашего решения нет очевидных преимуществ над моим))

Меня одного порой поражают его ответы ?
Спрашивает как лучше, а на предложенные варианты отвечает, что это неправильно или он это и так знал (Хотел убедится, ага).

Ну и напрашивается логичный вопрос:
R3WWVk0-1.png


Вспоминается одна старая фраза из профиля @Kruzya. (-Так правильно. -Нет.)

Чисто из интереса полистал несколько тем от автора и не увидел ни одной благодарности тем, кто ему помог. Может я конечно слепой, но..
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #15
ну у вашего решения нет очевидных преимуществ над моим))
У SM есть ограничение на кол-во одновременно открытых хендлов. Решение @nullent? предполагает открытие меньшего кол-ва хендлов.
 

Banana

Участник
Сообщения
892
Реакции
113
У SM есть ограничение на кол-во одновременно открытых хендлов. Решение @nullent? предполагает открытие меньшего кол-ва хендлов.
а как эти ограничение можно посмотреть? просто я не вкурсе был за ограничения... и что призойдет если количество хэндлов будет превышено?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #17
и что призойдет если количество хэндлов будет превышено?
https://github.com/alliedmodders/so...bdb0df28/core/logic/HandleSys.cpp#L1007-L1008
По тексту догадаетесь?

а как эти ограничение можно посмотреть? просто я не вкурсе был за ограничения...
Никак. Оно зависит от кол-ва плагинов.
 

Banana

Участник
Сообщения
892
Реакции
113
https://github.com/alliedmodders/so...bdb0df28/core/logic/HandleSys.cpp#L1007-L1008
По тексту догадаетесь?


Никак. Оно зависит от кол-ва плагинов.
У меня было время спамило такой ошибкой на пару моих плагинов а потом перестало хотя я вроде изменений никаких не далал... я мог это как-то у себя случайно отключить?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #19
я мог это как-то у себя случайно отключить?
Не могли, потому что это не отключается. Это защита от дебилов. SRCDS и так располагает всегда всего 3-мя гигабайтами оперативы (даже если у Вас физически на сервере 2 терабайта), а тут ещё SM к нему лезет. Последний пытается не дать плагинам обнаглеть в край. Правда получается у него это не очень, ибо он смотрит ток на кол-во хендлов, а не на пожираемую память ими.
 

Banana

Участник
Сообщения
892
Реакции
113
Не могли, потому что это не отключается. Это защита от дебилов. SRCDS и так располагает всегда всего 3-мя гигабайтами оперативы (даже если у Вас физически на сервере 2 терабайта), а тут ещё SM к нему лезет. Последний пытается не дать плагинам обнаглеть в край. Правда получается у него это не очень, ибо он смотрит ток на кол-во хендлов, а не на пожираемую память ими.
А подскажите пожалуйста если я в функцие создал мессив такого типа any[] array = new any[lrte]; и выгрузил в нее данные я могу просто выйти из функции или нужно как-то очистить данные из нее чтоб не было утечек? или SM сам это делает ?
 
Сверху Снизу