Функция C.free

Функция C.free освобождает память, ранее выделенную с помощью C-функций выделения памяти, таких как C.malloc, C.calloc или C.CString. В качестве единственного параметра она принимает указатель на память, который был возвращен при выделении. Важно всегда освобождать выделенную память, чтобы избежать утечек памяти. Функция C.free не возвращает значения.

Синтаксис

goC.free(ptr)

Пример с C.malloc

Давайте выделим память для целого числа с помощью C.malloc, используем ее и освободим с помощью C.free:

gopackage main

/*
#include <stdlib.h>
*/
import "C"
import "fmt"

func main() {
  ptr := C.malloc(C.sizeof_int)
  defer C.free(ptr)

  val := (*C.int)(ptr)
  *val = 42

  fmt.Println(int(*val))
}

Результат выполнения кода:

go42

Пример с C.CString

Давайте создадим C-строку с помощью C.CString, используем ее в C-функции и освободим с помощью C.free:

gopackage main

/*
#include <stdio.h>
#include <stdlib.h>
void printString(const char* str) {
  printf("%s\n", str);
}
*/
import "C"
import "unsafe"

func main() {
  str := "Hello from Go"
  cstr := C.CString(str)
  defer C.free(unsafe.Pointer(cstr))

  C.printString(cstr)
}

Результат выполнения кода:

go"Hello from Go"

Пример с освобождением памяти в C-функции

Иногда память выделяется в Go, но освобождается в C-функции. Давайте посмотрим, как это можно сделать:

gopackage main

/*
#include <stdlib.h>
void freeMemory(void* ptr) {
  free(ptr);
}
*/
import "C"
import "unsafe"

func main() {
  ptr := C.malloc(1024)
  C.freeMemory(ptr)
}

В этом примере память выделяется с помощью C.malloc в Go, а освобождается в C-функции freeMemory. Такой подход может быть полезен, когда управление памятью лучше делегировать C-коду.

Смотрите также

  • функцию C.CString,
    которая создает C-строку из Go-строки
  • функцию C.GoString,
    которая преобразует C-строку в Go-строку
  • функцию C.CBytes,
    которая создает C-байтовый массив из Go-слайса
  • функцию C.GoBytes,
    которая преобразует C-байтовый массив в Go-слайс