Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pergi: Bagaimana untuk mengendalikan kebocoran memori apabila mengembalikan CString?

Pergi: Bagaimana untuk mengendalikan kebocoran memori apabila mengembalikan CString?

王林
王林ke hadapan
2024-02-13 10:00:10924semak imbas

Go:返回 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.

Kandungan soalan

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

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam