Функция C.free
Функция C.free освобождает память, ранее выделенную с помощью
C-функций выделения памяти, таких как C.malloc, C.calloc
или C.CString. В качестве единственного параметра она принимает
указатель на память, который был возвращен при выделении. Важно всегда
освобождать выделенную память, чтобы избежать утечек памяти.
Функция C.free не возвращает значения.
Синтаксис
C.free(ptr)
Пример с C.malloc
Давайте выделим память для целого числа с помощью C.malloc,
используем ее и освободим с помощью C.free:
package 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))
}
Результат выполнения кода:
42
Пример с C.CString
Давайте создадим C-строку с помощью C.CString, используем ее
в C-функции и освободим с помощью C.free:
package 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)
}
Результат выполнения кода:
"Hello from Go"
Пример с освобождением памяти в C-функции
Иногда память выделяется в Go, но освобождается в C-функции. Давайте посмотрим, как это можно сделать:
package 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-слайс