Metin2 Memory & Lifetime Fixes - Rezolvare Memory Leak Game si DB
Acest fix rezolva mai multe probleme de memory leak si gestionare incorecta a memoriei din sursa Metin2, atat pe Game, cat si pe DB. Modificarile ajuta la eliberarea corecta a obiectelor si previn pastrarea unor pointeri invalizi dupa reload.
- rezolva memory leak-uri in AccountDB si Player Delete;
- elibereaza corect memoria dupa Shop si Skill Reload;
- elimina pointerii vechi din Item Manager;
- corecteaza eliberarea bufferului GuildMark la eroare;
- modificarile sunt controlate prin ENABLE_MEMORY_LIFETIME_FIXES.
*Link download / Code:
Deschide common/service.h si adauga:
Deschide game/src/db.cpp si cauta functia:
Code:
void AccountDB::Process()In aceasta functie, SQLMsg este sters abia dupa terminarea buclei, moment in care pMsg este deja NULL.
Modifica functia astfel incat obiectul sa fie eliberat la fiecare iteratie:
Nota: Daca functia ta contine si alte cazuri in switch, pastreaza-le. Modificarea importanta este mutarea lui delete pMsg in interiorul buclei.
Deschide db/src/ClientManagerPlayer.cpp si adauga langa celelalte include-uri:
Cauta functia:
Code:
void CClientManager::__RESULT_PLAYER_DELETE(
CPeer* peer,
SQLMsg* msg
)In aceasta functie cauta:
Code:
ClientHandleInfo* pi =
static_cast<ClientHandleInfo*>(qi->pvData);Inlocuieste cu:
Restul apelurilor existente prin pi-> raman neschimbate. Folosirea std::unique_ptr permite eliberarea automata a contextului, inclusiv atunci cand functia se termina printr-un return anticipat.
Deschide game/src/shop_manager.cpp si cauta functia:
Code:
bool CShopManager::Initialize(
TShopTable* table,
int size
)Cauta zona unde sunt eliminati vizitatorii si sunt golite map-urile:
Code:
m_map_pkShop.clear();
m_map_pkShopByNPCVnum.clear();Modifica partea de cleanup astfel:
Astfel, obiectele CShop sunt eliberate inainte de golirea map-urilor. m_map_pkShop ramane owner-ul, iar m_map_pkShopByNPCVnum contine doar referinte catre aceleasi instante.
Deschide game/src/skill.cpp si cauta:
Code:
SendLog("There were errors when loading skill table");In blocul else pentru eroarea de incarcare a tabelului de skill-uri, adauga inainte de SendLog:
Blocul respectiv va avea urmatoarea structura:
Modificarea elibereaza obiectele CSkillProto create temporar atunci cand incarcarea noii tabele esueaza, fara sa modifice tabela activa.
Deschide game/src/item_manager.cpp si cauta functia:
Code:
bool ITEM_MANAGER::Initialize(
TItemTable* table,
int size
)Adauga la inceputul functiei, imediat dupa acolada de deschidere:
Aceste containere trebuie golite inainte ca m_vec_prototype sa fie reconstruit, pentru a evita pastrarea pointerilor catre vechea generatie de item proto.
Deschide game/src/MarkImage.cpp si cauta blocul care verifica rezultatul functiei ilTexImage:
Code:
if (!ilTexImage(
WIDTH,
HEIGHT,
1,
4,
IL_BGRA,
IL_UNSIGNED_BYTE,
data
))
{
sys_err(
"GuildMarkImage: cannot initialize image"
);
return false;
}Inlocuieste cu:
Astfel, bufferul alocat prin malloc este eliberat inclusiv atunci cand initializarea imaginii esueaza.
Atentie la CMobManager!
In game/src/mob_manager.cpp exista o alta problema legata de lifetime-ul obiectelor CMob, insa autorul nu recomanda aplicarea unui M2_DELETE direct inainte de golirea map-urilor.
La reload, unele caractere active pot pastra in continuare pointeri catre vechile date Mob Proto, ceea ce ar putea produce un Use After Free.
Aceasta parte necesita o rezolvare separata:
- construirea noii generatii Mob Proto;
- actualizarea referintelor pentru instantele Non-PC active;
- eliberarea generatiei vechi abia dupa actualizarea pointerilor.
Nu sterge direct obiectele CMob fara sa verifici mai intai mecanismul de rebind din sursa ta.
Nota: Codurile originale pot necesita ajustari de indentare sau formatare in functie de structura sursei Metin2 utilizate.

la acest mesaj și conținutul se va afișa automat.

