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

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #41
Потому что нужно enum struct использовать, и оставить в покое классический enum. Дайте ему умереть.
И так данные копировать - нельзя.
 

Banana

Участник
Сообщения
892
Реакции
113
Banana, а так?
C-подобный:
void Func()
{
    any array_micro[mtp];
    GetClientAuthId(client, AuthId_Steam3, array_micro[mtp_a_steamid], 32);
}
Через Format сделал, так даже не пробовал) После фикса сервер не падал 4 часа... если еще 4 не упадет то можно смело заявлять что new any - дичейшая утечка памяти.
Сообщения автоматически склеены:

Потому что нужно enum struct использовать, и оставить в покое классический enum. Дайте ему умереть.
И так данные копировать - нельзя.
пробовал, не получилось))
 

_wS_

Участник
Сообщения
383
Реакции
760
Сегодня немного проверял Clone функции и набрёл на эту тему.
Хоть она старовата, но удивило это, и особенно то, что на это никто не отреагировал:

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;
}

Вот вам явное преимущество.

Есть шансы, что более правильно было сделать public any и return view_as<ArrayList>, но это фгня.
aExample.Clone() - владельцем Handle остался "Основной плагин".
"Остальные плагины" не могут его закрыть = утечка, т.к. "Основной плагин" его не закрывает.
Поэтому нужно делать:

C++:
return view_as<ArrayList>(CloneHandle(aExample, plugin));

Но и здесь могут быть проблемы, если вы надеетесь на то, что ваш оригинальный aExample массив не будет изменён.
Если важно сохранить целостность aExample, то правильно будет так:

C++:
public any MyNative_(Handle plugin, int args)
{
    ArrayList hndl_clone = aExample.Clone();
    ArrayList hndl_owner = view_as<ArrayList>(CloneHandle(hndl_clone, plugin));
    delete hndl_clone;
    return hndl_owner;
}

@Banana, хранить строки с вопросами/ответами более оптимизировано в StringMap, т.к. он не хранит в памяти весь размер буфера (как ArrayList), а хранит конкретно строку без лишнего размера. Ключом для StringMap может быть уникальный id вопросов/ответов.

C++:
int GetId()
{
    static int i;
    return ++i;
}

char sId[12];
[U]IntToString(GetId(), sId, sizeof(sId));

Ну и хранить вопросы с ответами можно так:

C++:
#define MAX_ANSWERS 2 // Максимум ответов на вопрос
ArrayList g_hAr; // Список вопросов и ответов

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    g_hAr = new ArrayList(MAX_ANSWERS + 1);
    return APLRes_Success;
}
Первым в списке пусть будет id вопроса, а дальше ответы, 0 = нет ответа (или -1, смотри сам).
 
Сверху Снизу