CodeBlanks Logo Icon CodeBlanks

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.free ile 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

main.go
package main

/*
// C kodu buraya
*/
import "C"

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
p := C.malloc(64)
____ C.free(p)
Cevap
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

İleri seviye bölümündeki tüm dersler