cgo ve bellek
- Go kursu
- İleri seviye
- Ders 17/68
- 4 dk
C.CString ile ayrılan belleği serbest bırakmayı öğrenirsin.
cgo ve bellek kuralları
İki çöp toplama dünyası vardır: Go belleğini GC yönetir, C belleğini sen. Temel kurallar:
- C'de ayrılan her şey (
C.CString,C.malloc)C.freeile bırakılır. - Go işaretçisini C'ye verebilirsin ama C onu çağrı bittikten sonra saklayamaz.
- C'ye verilen Go belleği içinde başka Go işaretçisi olmamalıdır.
defer ile serbest bırakma
Sızıntıyı önlemenin en kolay yolu, ayırdığın satırın hemen altına defer C.free yazmaktır:
buf := C.malloc(1024)
defer C.free(buf)GODEBUG=cgocheck=1 (varsayılan) işaretçi kurallarının bir kısmını çalışma anında denetler ve ihlalde panic üretir.
Uygulama Ayır ve bırak
Önsözde #include <stdlib.h> ekle. p := C.malloc(16) ile bellek ayır, hemen ardından defer C.free(p) yaz ve p != nil sonucunu yazdır.
Başlangıç kodu
package main
/*
// C kodu buraya
*/
import "C"
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
/*
#include <stdlib.h>
*/
import "C"
import "fmt"
func main() {
p := C.malloc(16)
defer C.free(p)
fmt.Println(p != nil)
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir C kütüphanesi Go işaretçisini daha sonra kullanmak için saklarsa ne olur?
- Sorun yoktur
- Go otomatik kopyalar
- Derleyici engeller
- Kural ihlalidir; GC belleği taşıyabilir veya toplayabilir Doğru cevap
Açıklama: cgo işaretçi kuralları C'nin Go işaretçisini çağrı sonrası saklamasını yasaklar; böyle durumlarda veri C belleğine kopyalanır veya runtime/cgo.Handle kullanılır.
2 Belleği bırak
p := C.malloc(64)
____ C.free(p)
p := C.malloc(64)
defer C.free(p)
Açıklama: defer, fonksiyon bitince C.free çağrılmasını garanti eder.
3 Bellek ve sahibi
| Kavram | Anlamı |
|---|---|
make([]int, n) |
Go GC |
C.malloc(n) |
Sen (C.free) |
C.CString(s) |
Metni C belleğine kopyalar |
cgo.Handle |
Go değerini C'ye güvenle taşır |