valgrind
- C kursu
- Orta seviye
- Ders 97/116
- 5 dk
valgrind ile bellek hatalarını bulmayı öğrenirsin.
valgrind ile bellek denetimi
valgrind, programın bellek kullanımını çalışma anında denetleyen bir araçtır. En yaygın kullanımı bellek sızıntılarını bulmaktır: valgrind --leak-check=full ./program.
valgrind programı yavaş çalıştırır ama her malloc'a karşılık bir free olup olmadığını denetler. Sızıntı varsa raporda "definitely lost" satırı ve kaç bayt kayıp olduğu yazar. Ayrıca ilk değeri verilmemiş değişken okumayı ve dizi sınırı dışına çıkmayı da yakalar. Bu denetimler derleyici tarafından yakalanamaz; yalnızca çalışma anında ortaya çıkarlar. Bu yüzden valgrind, dinamik bellek kullanan her C programında düzenli olarak çalıştırılmalıdır.
Sızıntısız program
valgrind'in temiz rapor vermesi için her malloc'a karşılık bir free çağrısı olmalıdır. Ayırdığın belleği kullanım bitince hemen serbest bırakırsın.
Örnek: int *arr = malloc(3 * sizeof(int)); ile üç tamsayılık yer ayırırsın. Değerleri doldurduktan sonra toplamı hesaplarsın ve free(arr); ile belleği iade edersin. sizeof(int) tür boyutunu verir; böylece kod farklı platformlarda doğru çalışır. free'yi unutmak sızıntıya, çok erken çağırmak ise dangling pointer'a yol açar. Doğru sıra: ayır, kullan, serbest bırak.
Uygulama Sızıntısız program yaz
int *arr = malloc(3 * sizeof(int)); ile üç elemanlı dizi ayır. arr[0] = 10; arr[1] = 20; arr[2] = 30; ata. int sum = arr[0] + arr[1] + arr[2]; hesapla. printf("%d\n", sum); yazdır. Son olarak free(arr); ile belleği iade et.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
// 3 elemanlı int dizi için bellek ayır
// elemanlara 10, 20, 30 değerlerini ata
// toplamı yazdır
// belleği serbest bırak
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(3 * sizeof(int));
arr[0] = 10; arr[1] = 20; arr[2] = 30;
int sum = arr[0] + arr[1] + arr[2];
printf("%d\n", sum);
free(arr);
return 0;
}Beklenen çıktı
60
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 valgrind ne tür hataları yakalar?
- Sözdizimi hatalarını
- Tür uyumsuzluklarını
- Derleyici uyarılarını
- Bellek sızıntılarını Doğru cevap
Açıklama: valgrind bellek sızıntılarını ve ilk değersiz okumaları yakalar.
2 Bellek yönetimini eşle
| Kavram | Anlamı |
|---|---|
malloc |
Bellek ayır |
free |
Bellek iade et |
sizeof(int) |
Tür boyutu |
--leak-check |
Sızıntı denetimi |
3 malloc çağrısını tamamla
int *arr = malloc(3 * sizeof(____));
int *arr = malloc(3 * sizeof(int));
Açıklama: sizeof(int) int türünün bayt boyutunu verir.