🔥 [REHBER] Memory Leak Tespiti ve Valgrind ile RAM Optimizasyonu (Client Source)

memodalxxx

[CoMa].flex
Katılım
22 Ara 2011
Konular
49
Mesajlar
245
Online süresi
6g 54289s
Reaksiyon Skoru
186
Altın Konu
2
Başarım Puanı
138
TM Yaşı
14 Yıl 4 Ay 2 Gün
MmoLira
138
DevLira
6

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

"İSTEK ÜZERİNE HAZIRLANDI"

Selamlar arkadaşlar,
Bu konuda özellikle client source geliştirenler için:
Memory Leak (hafıza sızıntısı) tespiti
Valgrind kullanımı
RAM optimizasyon teknikleri
Modern C++ doğru kullanımı
detaylı ve güncel şekilde anlatılmıştır.
Memory Leak Nedir?
Memory Leak, programın ayırdığı belleği (malloc/new) geri bırakmaması durumudur.
Belirtiler:
RAM kullanımının sürekli artması
FPS düşüşü
Uzun süre sonra crash
Stabilite problemleri
Valgrind Hakkında Önemli Not
Valgrind Linux ortamında native çalışır, Windows üzerinde doğrudan desteklenmez.
✔ Alternatifler:
WSL (Windows Subsystem for Linux)
Virtual Machine (Ubuntu vb.)
Dr.Memory
Valgrind Kurulumu
Kod:
 sudo apt update sudo apt install valgrind
Valgrind Kullanımı
Kod:
 g++ -g client.cpp -o client valgrind --leak-check=full --show-leak-kinds=all ./client
Detaylı analiz:
Kod:
 valgrind --tool=memcheck --track-origins=yes --leak-check=full ./client
Çıktı Okuma
Kod:
 ==1234== 64 bytes in 1 blocks are definitely lost
definitely lost → kesin leak
indirectly lost → bağlı leak
possibly lost → şüpheli
still reachable → kritik değil
Yaygın Hatalar ve Doğruları
1. Raw Pointer Kullanımı (ÖNERİLMEZ)
Eski kullanım:
Kod:
 std::vector<int*> list; list.push_back(new int(5));
for(auto ptr : list) delete ptr;
✔ Modern C++ çözüm:
Kod:
 #include #include
std::vector<std::unique_ptr> list; list.push_back(std::make_unique(5));
2. DELETE Kullanımı
Gereksiz kontrol:
Kod:
 if(ptr != nullptr) delete ptr;
✔ Doğru kullanım:
Kod:
 delete ptr; ptr = nullptr;
3. malloc / free
Kod:
 char* buffer = (char*)malloc(256); free(buffer);
4. String Optimizasyonu
Verimsiz:
Kod:
 std::string s = "test"; s = s + "abc";
✔ Optimize:
Kod:
 std::string s = "test"; s.reserve(100); s += "abc";
RAM Optimizasyon Teknikleri
Smart Pointer Kullan
unique_ptr / shared_ptr tercih et
Object Pool Kullan
Sürekli allocation yapma
reuse sistemi kur
Asset Yönetimi
Lazy loading
Cache sistemi
Kullanılmayanları temizle
Gereksiz Allocation’dan Kaçın
Kod:
 for(int i = 0; i < 10000; i++) new Object(); // kaçınılmalı
Valgrind Hataları
Yavaş Çalışma
✔ Normal (10-20x)
Invalid Read / Write
Kod:
 int arr[5]; arr[10] = 1;
Segmentation Fault
Null pointer
Free sonrası erişim
Debug ile Kullanım
Kod:
 g++ -g client.cpp -o client valgrind ./client
Tavsiyeler
✔ Modern C++ kullan
✔ Raw pointer’dan kaçın
✔ Uzun süreli test yap
✔ Leak kontrolünü alışkanlık haline getir
Sonuç
Daha düşük RAM kullanımı
Daha stabil client
Daha az crash
Daha iyi performans

Valgrind Kullanırken Alınabilecek Hatalar
Program Çok Yavaş
✔ Normal (10-20x yavaşlatır)
False Positive Leak
Kod:
 --suppressions=valgrind.supp
Invalid Read / Write
Kod:
 int arr[5]; arr[10] = 1; // ❌
Segmentation Fault
Kod:
 if(ptr != nullptr) delete ptr;
Debug + Valgrind Kombosu
Kod:
 g++ -g client.cpp -o client valgrind ./client
Bonus: SAFE_DELETE Macro
Kod:
 #ifdef DEBUG #define SAFE_DELETE(p) { if(p) { delete (p); (p)=nullptr; } } #else #define SAFE_DELETE(p) delete (p) #endif

EDIT
Gelen geri bildirimler doğrultusunda modern C++ kullanımı ve bazı teknik detaylar güncellenmiştir. Katkı sağlayan herkese teşekkürler.

---

İstersen bir sonraki konu olarak:
Client FPS Boost + Render Optimizasyonu (Advanced)
FiveM / MMO Script Memory Yönetimi (Deep Level)
Aynı kalitede paylaşabilirim.
--------------------------------------------------------------------------------
İyi formlar şimdiden teşekkürler işine yarayan arkadaşlar bir beğeni ref fazla görmezse sevinirim.
 
Son düzenleme:
PAYLAŞIM İÇİN TEŞEKKÜRLER,ELİNE SAĞLIK.
 
Valgrind Linux ortamında native çalışır, Windows uygulamalarında doğrudan desteklenmez. Beklenen performans olmayacak deneyenlerde.
Ek olarak.


for(auto ptr : list) delete ptr;

bu kısım eksik bunun yerine:

std::vector<std::unique_ptr<int>> list;
list.push_back(std::make_unique<int>(5));

-------------------------------------------------

if(ptr != nullptr) delete ptr;

Bu kısım yanlış doğrusu:

delete ptr;
ptr = nullptr;


-----------------------------------------------
std::string s = "test";
s = s + "abc";

Bu kısım yanlış doğrusu:

s.reserve(100);
s += "abc";

----------------------------------------------

g++ -g client.cpp -o client valgrind ./client

Bu kısım yanlış doğrusu:

g++ -g client.cpp -o client
valgrind ./client
 
Son düzenleme:
Gelen geri bildirimler doğrultusunda bazı teknik kısımlar güncellenmiştir. Katkı sağlayan herkese teşekkürler.
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)