[FIX] DB Kapatılırken Ortaya Çıkan Bellek Sızıntısı (Memory Leak)

Arkhe Arete

Üye
Üye
Mesaj
24
Beğeni
94
Puan
298
Ticaret Puanı
0
CClientManager Destroy fonksiyonu sunucu kapanırken çalışıyor ancak bellekteki bazı objeleri serbest bırakmıyor.
Kapanış sırasında m_peerList listesindeki peer nesnelerinin sadece Destroy() fonksiyonu çağrılıyor ancak nesneler bellekten silinmiyor. Bu fix ile
nesnelerin bellekten tamamen silinmesi sağlanır.

Giriş işlemlerine ait verilerin tutulduğu haritalarda ( m_map_pkLoginData , m_map_kLogonAccount vb.) yer alan nesneler de sunucu kapanırken serbest bırakılmıyordu.
fix ile bu haritaların içi döngüyle gezilerek veriler temizlenir ve double-free hatalarının önüne geçer.

DB kanalında definitely lost olarak raporlanan bellek kaçaklarını kapatarak sunucunun daha sağlıklı kapanmasını sağlar.

Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


 
Son düzenleme:
Bu fix uygulanırken LoginData map’lerinin aynı CLoginData* pointerlarını farklı keylerle tuttuğuna dikkat edilmeli. m_map_pkLoginData silindikten sonra m_map_kLogonAccount tarafında aynı pointera IsDeleted() ile erişmek use-after-free, tekrar delete etmek double-free oluşturabilir. Bu yüzden LoginData cleanup pointerları unique/set içinde toplayıp tek sefer delete edecek şekilde yapılmalı. Ayrıca peer tarafında delete CPeer çağrısı destructor üzerinden Close()->OnClose()->ItemIDRangeManager::UpdateRange zincirini çalıştırdığı için kapanış sırasındaki manager yaşam süresi kontrol edilmeli veya guard eklenmelidir.
 
Bu fix uygulanırken LoginData map’lerinin aynı CLoginData* pointerlarını farklı keylerle tuttuğuna dikkat edilmeli. m_map_pkLoginData silindikten sonra m_map_kLogonAccount tarafında aynı pointera IsDeleted() ile erişmek use-after-free, tekrar delete etmek double-free oluşturabilir. Bu yüzden LoginData cleanup pointerları unique/set içinde toplayıp tek sefer delete edecek şekilde yapılmalı. Ayrıca peer tarafında delete CPeer çağrısı destructor üzerinden Close()->OnClose()->ItemIDRangeManager::UpdateRange zincirini çalıştırdığı için kapanış sırasındaki manager yaşam süresi kontrol edilmeli veya guard eklenmelidir.
Yorumun için teşekkür ederim konuyu güncelleyeceğim
 
Yaptığım Valgrind testleri sonucu bu şekilde daha olumlu sonuçlar aldığımı söyleyebilirim lütfen eski fixi uygulayanlar tamamen geri alsınlar ve bunu uygulasınlar ayrıca katkıda bulunanlara teşekkürler.

Eski fixi geri almayı unutma!!

Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.


 
Geri
Üst