Русское сообщество по скриптингу

ArrayDestroy в plugin_end() и вопрос про pev_model  [Решено]

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение Dorus » 20 мар 2019, 17:17

Вопрос к знатокам: обязательно ли очищать динамический массив в plugin_end(), либо же он сам автоматически очистится?

Код: Выделить всё
public plugin_end()
{
    ArrayDestroy(g_aArray)
}


Ну и еще один вопрос, что именно хранится у объектах на карте в pev_model? Может быть так, что у двух объектов на карте один и тот же pev_model или же pev_model - индивидуальное значение на карте (что то на подобии id для объекта)?

Код: Выделить всё
pev(iEnt, pev_model, szBuffer, charsmax(szBuffer))
client_print(0, print_chat, "%s", szBuffer)
// Получится, к примеру, "*63"        
:thumbs_up :yahoo: :bravo:
Группа плагинов:
vk.com/remake_dorus
Аватара пользователя
Dorus
 
Сообщения: 172
Зарегистрирован: 28 авг 2014, 17:58
Благодарил (а): 27 раз.
Поблагодарили: 15 раз.
Опыт программирования: Больше трех лет
Языки программирования: PAWN
C++

Re: ArrayDestroy в plugin_end() и вопрос про pev_model  [Решено]

Сообщение MrJunior » 20 мар 2019, 17:33

Dorus писал(а):Вопрос к знатокам: обязательно ли очищать динамический массив в plugin_end(), либо же он сам автоматически очистится?

Код: Выделить всё
public plugin_end()
{
    ArrayDestroy(g_aArray)


Память вполне может очистится сама, случиться это после краша сервера из-за утечки памяти, вызванной не уничтоженным массивом/хэндлом.

pev_model сохраняет модель объекта. Пример: КТ игрок с моделью "models/player/urban/urban.mdl"
Аватара пользователя
MrJunior
Скриптер
 
Сообщения: 146
Зарегистрирован: 21 сен 2016, 19:46
Откуда: localhost
Благодарил (а): 3 раз.
Поблагодарили: 31 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn | Web | Lua

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение SISA » 21 мар 2019, 04:09

Dorus писал(а):Вопрос к знатокам: обязательно ли очищать динамический массив в plugin_end(), либо же он сам автоматически очистится?

Код: Выделить всё
public plugin_end()
{
    ArrayDestroy(g_aArray)
}


Само оно точно не удалится. Даже в инклуде написано:

Plugins are responsible for freeing all Array handles they acquire, including those from ArrayClone. Failing to free handles will result in the plugin and AMXX leaking memory.
Аватара пользователя
SISA
 
Сообщения: 284
Зарегистрирован: 28 ноя 2009, 01:46
Благодарил (а): 19 раз.
Поблагодарили: 126 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение KOTOKU » 22 мар 2019, 18:39

Если память мне не изменяет, она сама очищается при загрузке новой карты.
Именно очищается, а не удаляется.

На практике лучше все самому делать, а не надеяться на что-то.
В вашем случае. не поленитесь сами удалить всё, что создали.
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение Leonidddd » 22 мар 2019, 21:47

//DEL(bad check)
Последний раз редактировалось Leonidddd 26 мар 2019, 18:36, всего редактировалось 2 раз(а).
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение SISA » 23 мар 2019, 18:34

2Leonidddd
Да что вы говорите :-)

А теперь берем этот плагин и смотрим:

Код: Выделить всё
#include <amxmodx>

public plugin_init()
{
    new Array:
g_ArraysHandle ArrayCreate(481);

    for(new 
i10000000i++)
        
ArrayPushString(g_ArraysHandlefmt("dwadawdrawdfawdsdrewqwertgfdgdfgfdd%i"1));


После нескольких смен карты:

23-03-2019 17-33-10.jpg

P.S. Если уж собрались использовать ArrayPushArray, то указывайте размер массива при добавлении данных.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
SISA
 
Сообщения: 284
Зарегистрирован: 28 ноя 2009, 01:46
Благодарил (а): 19 раз.
Поблагодарили: 126 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение Leonidddd » 24 мар 2019, 01:01

SISA, 10 миллионов циклов , однако неплохо) ух, при таком раскладе, явно видно утечку озу.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2557
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 192 раз.
Поблагодарили: 718 раз.

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение BlackSignature » 10 апр 2019, 04:07

Провёл ради интереса тесты с динамическим массивом на хостинге.
Оперативная память: Доступно 2048MB.


Код: Выделить всё
new Array:g_ArraysHandle

public concmd_Test(id) {
   if(!g_ArraysHandle) {
      g_ArraysHandle = ArrayCreate(32, 1);
   }

   for(new i; i < 100000; i++)
      ArrayPushString(g_ArraysHandle, "TEST");
   
   return PLUGIN_HANDLED
}


Сколько не пушишь - при смене карты память освобождается самостоятельно. Но если многократно повторять пуши, то при
Использовано 1097 MB

вылезает
Код: Выделить всё
02:44:51 Failed to grow array
02:44:51 [AMXX] Displaying debug trace (plugin "test_plugin1.amxx", version "0.1")
02:44:51 [AMXX] Run time error 10: native error (native "ArrayPushString")
02:44:51 [AMXX]    [0] test_plugin1.sma::concmd_Test (line 53)


Если после этого ещё раз сделать пуш, сервер падает.
Если сменить карту - память сама НЕ зачищается.
Если добавить зачистку в plugin_end(), память так же НЕ зачищается.
Код: Выделить всё
public plugin_end() {
   if(g_ArraysHandle) {
      ArrayDestroy(g_ArraysHandle)
   }
}


Не умею в Си от слова совсем, но цепочку вроде составил правильно:
Вы должны зарегистрироваться, чтобы видеть ссылки. ... s.cpp#L412
Вы должны зарегистрироваться, чтобы видеть ссылки. ... ucts.h#L32
Вы должны зарегистрироваться, чтобы видеть ссылки. ... cts.h#L160
Аватара пользователя
BlackSignature
 
Сообщения: 24
Зарегистрирован: 23 ноя 2012, 14:31
Откуда: Москва
Благодарил (а): 5 раз.
Поблагодарили: 12 раз.
Опыт программирования: Больше трех лет
Языки программирования: AMXX Pawn

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение xbass13 » 10 апр 2019, 10:50

Просто не корректно идёт работа с realloc. Вот информация:
Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель, и блок памяти, на который указывает аргумент ptr(m_Data) остается неизменным.
1. Ошибка в консоли
В нашем случае, т.к. каждый раз в два раза увеличивается размер выделенной памяти, в итоге приходим к тому, что не удаётся выделить блок памяти, realloc возвращает NULL указатель, и этот указатель помещается в m_Data, вывод ошибки в консоль. Что собственно не верно сделано, т.к. старый m_Data все еще указывал на ранее выделенную память.
2. Утекает память, не очищается
В деструкторе ~CellArray() должна почиститься память, но т.к. указатель NULL, то ранее выделенная память "утекает"
3. Падение сервера
Продолжение пункта 1
Далее происходит ещё один push, сервер падает на строке
Код: Выделить всё
cell *arr = &m_Data[m_Size * m_BlockSize];

Т.к m_Data == NULL, но это уже не важно, т.к. вся проблема комом пошла со строки
Код: Выделить всё
m_Data = (cell *)realloc(m_Data, sizeof(cell)* m_BlockSize * m_AllocSize);
метода bool CellArray::GrowIfNeeded(size_t count)

Поздравляю, вы нашли баг
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: ArrayDestroy в plugin_end() и вопрос про pev_model

Сообщение Mistrick » 10 апр 2019, 11:46

xbass13, можете зарепортить баг на гитхаб?
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

След.

Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 8