Garey, везде где не требуется инициализация переменных, я использую static, они хранятся в пределах стека, из-за кучи косяков которые возникают при использовании оператора new на высоконагруженном сервере. я не знаком с терминологией cell данные, но предполагаю, что это данные размером в 4 байта, как int. Я получил кучу рандомных ошибок, примерно в таком коде:
Код:
stock log_acs(const level, format[], any:...) {
static s_log_data[768];
if (CVAR[ACS_LOG] > 0 && CVAR[ACS_LOG_LEVEL] >= level ) {
vformat(s_log_data, charsmax(s_log_data), format, 3);
if (CVAR[ACS_LOG_CONSOLE] > 0)
acs_console_print(0, s_log_data);
log_to_file(CVAR[ACS_LOG_FILE], s_log_data);
}
}
Если поменять static на new, сервер будет нестабильно работать под нагрузкой при компиляции плагина с любым параметром
#pragma dynamic 20 * 65536
. Поэтому, частично, можно встретить в коде объявление переменной через new, возвращаемой из функции в качестве значения.
Ну и самое главное, если ошибиться с переменной типа static (которая хранит указатель на объект) и не освободить выделенную объекту память, то "менеджер памяти", на сколько я понял очистит выделяемую объекту память, по указателю (не пинайте, я не смотрел, так написано в описании). По крайней мере, я в это верю
У разработчика это приблуды, в описании написано: "не задавайте вопросов, если вам кажется что что-то работает не так - вам только кажется, попробуйте поставить себя на мое место и еще раз подумать зачем я это сделал". Я не стал задавать ему вопросы, тем более что его сайт помер 7 лет назад.
В общем простая замена переменной с new на static - решила проблему с утечками памяти, хотя сами косяки, например, незакрытые указатели на mysql запрос, я уже обнаружил и исправил позднее... глядя на то как безобразно обращаются с переменными в других плагинах, изначально, я предполагал, что хоть с памятью проблем не будет... я ошибался
Одно дело 10 переменных на плагин, другое дело 200 и десятки массивов.
Утечек памяти давно нет + под все что использует динамические массивы я пишу свой "менеджер" и независимо от поведения штатного функционала AMXX - стараюсь корректно освободить указатели (destroy, close) и все используемые динамические данные.