Rumah > Artikel > pembangunan bahagian belakang > Pergi: Bagaimana untuk mengendalikan kebocoran memori apabila mengembalikan CString?
editor php Xigua berada di sini untuk berkongsi dengan anda penyelesaian kepada masalah kebocoran memori apabila mengembalikan CString dalam bahasa Go. Dalam Go, rentetan C ialah tatasusunan bait ditamatkan nol, manakala rentetan Go ialah tatasusunan bait awalan panjang. Apabila kita perlu menukar rentetan Go kepada rentetan C dan belakang, kita perlu memberi perhatian kepada peruntukan dan pelepasan memori untuk mengelakkan kebocoran memori. Artikel ini akan memperkenalkan beberapa kaedah untuk menangani kebocoran memori untuk membantu anda menyelesaikan masalah biasa ini.
Saya mempunyai tandatangan fungsi berikut yang kemudiannya mengembalikan rentetan json
func getdata(symbol, day, month, year *c.char) *c.char { combine, _ := json.marshal(combinerecords) log.println(string(combine)) return c.cstring(string(combine)) }
Kemudian panggil kod go dalam python
import ctypes from time import sleep library = ctypes.cdll.LoadLibrary('./deribit.so') get_data = library.getData # Make python convert its values to C representation. # get_data.argtypes = [ctypes.c_char_p, ctypes.c_char_p,ctypes.c_char_p,ctypes.c_char_p] get_data.restype = ctypes.c_char_p for i in range(1,100): j= get_data("BTC".encode("utf-8"), "5".encode("utf-8"), "JAN".encode("utf-8"), "23".encode("utf-8")) # j= get_data(b"BTC", b"3", b"JAN", b"23") print('prnting in Python') # print(j) sleep(1)
Ia berfungsi dengan baik pada bahagian ular sawa, tetapi saya bimbang tentang kebocoran memori apabila memanggil fungsi dalam gelung pada bahagian ular sawa.
Bagaimana untuk menangani kebocoran memori? Patutkah saya kembalikan bytes
而不是 cstring
dan memproses bait pada bahagian python untuk mengelakkan kebocoran memori? Saya telah menemui pautan ini untuk mengendalikannya tetapi entah bagaimana saya tidak tahu saiz rentetan json yang dikembalikan selepas marshalling
python sepatutnya kelihatan seperti ini:
import ctypes from time import sleep library = ctypes.cdll('./stackoverflow.so') get_data = library.getdata free_me = library.freeme free_me.argtypes = [ctypes.pointer(ctypes.c_char)] get_data.restype = ctypes.pointer(ctypes.c_char) for i in range(1,100): j = get_data("", "", "") print(ctypes.c_char_p.from_buffer(j).value) free_me(j) sleep(1)
pergi sepatutnya kelihatan seperti ini:
package main /* #include <stdlib.h> */ import "c" import ( "log" "unsafe" ) //export getdata func getdata(symbol, day, month, year *c.char) *c.char { combine := "combine" log.println(string(combine)) return c.cstring(string(combine)) } //export freeme func freeme(data *c.char) { c.free(unsafe.pointer(data)) } func main() {}
Dan gunakan baris arahan ini untuk menjana perpustakaan kongsi:
python3 --version python 3.8.10 go version go version go1.19.2 linux/amd64 go build -o stackoverflow.so -buildmode=c-shared github.com/sjeandeaux/stackoverflow python3 stackoverflow.py 2023/01/03 13:54:14 combine b'combine' ...
from ubuntu:18.04 run apt-get update -y && apt-get install python -y copy stackoverflow.so stackoverflow.so copy stackoverflow.py stackoverflow.py cmd ["python", "stackoverflow.py"]
docker build --tag stackoverflow . docker run -ti stackoverflow 2023/01/03 15:04:24 combine b'combine' ...
Atas ialah kandungan terperinci Pergi: Bagaimana untuk mengendalikan kebocoran memori apabila mengembalikan CString?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!